[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] Merge with xen-ia64-unstable.hg.
# HG changeset patch # User kfraser@xxxxxxxxxxxxxxxxxxxxx # Date 1170955650 0 # Node ID f9277e2548b5ffcaaffb39ae269c13915084ca59 # Parent fbc233a1dc53dd0928fb8c0062d6582ef210950d # Parent 5a1abfefe892c27ddee13eb2537dbe1a5089accb Merge with xen-ia64-unstable.hg. --- linux-2.6-xen-sparse/include/asm-i386/a.out.h | 26 ---- xen/include/asm-ia64/kexec.h | 25 ---- xen/include/asm-powerpc/kexec.h | 25 ---- xen/include/asm-x86/kexec.h | 20 --- xen/include/asm-x86/x86_32/kexec.h | 39 ------ xen/include/asm-x86/x86_64/kexec.h | 38 ------ .hgignore | 1 linux-2.6-xen-sparse/drivers/xen/fbfront/xenkbd.c | 103 ++++++++++++----- linux-2.6-xen-sparse/net/core/skbuff.c | 46 ++++---- tools/examples/vif-bridge | 7 + tools/examples/xen-hotplug-common.sh | 5 tools/ioemu/hw/cirrus_vga.c | 4 tools/ioemu/hw/ide.c | 4 tools/ioemu/hw/rtl8139.c | 6 - tools/ioemu/xenstore.c | 60 ++++++++++ tools/libxc/xc_hvm_restore.c | 5 tools/libxc/xc_hvm_save.c | 70 ++++-------- tools/libxc/xenguest.h | 3 tools/libxc/xg_private.c | 3 tools/misc/Makefile | 4 tools/misc/xen-detect.c | 108 ++++++++++++++++++ tools/python/xen/xend/XendCheckpoint.py | 7 - tools/python/xen/xend/XendConfig.py | 41 +++++++ tools/python/xen/xend/XendDomain.py | 20 ++- tools/python/xen/xend/XendDomainInfo.py | 58 +++++++++- tools/python/xen/xend/server/BlktapController.py | 62 ++++++++++ tools/python/xen/xend/server/DevController.py | 52 +++++---- tools/xcutils/xc_restore.c | 5 tools/xenfb/vncfb.c | 10 + xen/arch/powerpc/machine_kexec.c | 5 xen/arch/x86/crash.c | 1 xen/arch/x86/hvm/hvm.c | 2 xen/arch/x86/hvm/pmtimer.c | 75 +++++++------ xen/arch/x86/machine_kexec.c | 53 ++++++++- xen/arch/x86/x86_64/Makefile | 1 xen/arch/x86/x86_64/compat_kexec.S | 126 ++++++++++++++++++++++ xen/common/kexec.c | 1 xen/common/memory.c | 10 + xen/drivers/char/console.c | 2 xen/include/asm-x86/config.h | 4 xen/include/asm-x86/hvm/vpt.h | 14 -- xen/include/asm-x86/shadow.h | 5 xen/include/public/hvm/save.h | 12 +- xen/include/xen/kexec.h | 1 44 files changed, 791 insertions(+), 378 deletions(-) diff -r fbc233a1dc53 -r f9277e2548b5 .hgignore --- a/.hgignore Wed Feb 07 10:46:18 2007 -0700 +++ b/.hgignore Thu Feb 08 17:27:30 2007 +0000 @@ -138,6 +138,7 @@ ^tools/misc/miniterm/miniterm$ ^tools/misc/xc_shadow$ ^tools/misc/xen_cpuperf$ +^tools/misc/xen-detect$ ^tools/misc/xenperf$ ^tools/pygrub/build/.*$ ^tools/python/build/.*$ diff -r fbc233a1dc53 -r f9277e2548b5 linux-2.6-xen-sparse/drivers/xen/fbfront/xenkbd.c --- a/linux-2.6-xen-sparse/drivers/xen/fbfront/xenkbd.c Wed Feb 07 10:46:18 2007 -0700 +++ b/linux-2.6-xen-sparse/drivers/xen/fbfront/xenkbd.c Thu Feb 08 17:27:30 2007 +0000 @@ -29,10 +29,12 @@ struct xenkbd_info { - struct input_dev *dev; + struct input_dev *kbd; + struct input_dev *ptr; struct xenkbd_page *page; int irq; struct xenbus_device *xbdev; + char phys[32]; }; static int xenkbd_remove(struct xenbus_device *); @@ -56,23 +58,36 @@ static irqreturn_t input_handler(int rq, rmb(); /* ensure we see ring contents up to prod */ for (cons = page->in_cons; cons != prod; cons++) { union xenkbd_in_event *event; + struct input_dev *dev; event = &XENKBD_IN_RING_REF(page, cons); + dev = info->ptr; switch (event->type) { case XENKBD_TYPE_MOTION: - input_report_rel(info->dev, REL_X, event->motion.rel_x); - input_report_rel(info->dev, REL_Y, event->motion.rel_y); + input_report_rel(dev, REL_X, event->motion.rel_x); + input_report_rel(dev, REL_Y, event->motion.rel_y); break; case XENKBD_TYPE_KEY: - input_report_key(info->dev, event->key.keycode, event->key.pressed); + dev = NULL; + if (test_bit(event->key.keycode, info->kbd->keybit)) + dev = info->kbd; + if (test_bit(event->key.keycode, info->ptr->keybit)) + dev = info->ptr; + if (dev) + input_report_key(dev, event->key.keycode, + event->key.pressed); + else + printk("xenkbd: unhandled keycode 0x%x\n", + event->key.keycode); break; case XENKBD_TYPE_POS: - input_report_abs(info->dev, ABS_X, event->pos.abs_x); - input_report_abs(info->dev, ABS_Y, event->pos.abs_y); + input_report_abs(dev, ABS_X, event->pos.abs_x); + input_report_abs(dev, ABS_Y, event->pos.abs_y); break; } - } - input_sync(info->dev); + if (dev) + input_sync(dev); + } mb(); /* ensure we got ring contents */ page->in_cons = cons; notify_remote_via_irq(info->irq); @@ -85,7 +100,7 @@ int __devinit xenkbd_probe(struct xenbus { int ret, i; struct xenkbd_info *info; - struct input_dev *input_dev; + struct input_dev *kbd, *ptr; info = kzalloc(sizeof(*info), GFP_KERNEL); if (!info) { @@ -94,6 +109,7 @@ int __devinit xenkbd_probe(struct xenbus } dev->dev.driver_data = info; info->xbdev = dev; + snprintf(info->phys, sizeof(info->phys), "xenbus/%s", dev->nodename); info->page = (void *)__get_free_page(GFP_KERNEL); if (!info->page) @@ -101,32 +117,52 @@ int __devinit xenkbd_probe(struct xenbus info->page->in_cons = info->page->in_prod = 0; info->page->out_cons = info->page->out_prod = 0; - input_dev = input_allocate_device(); - if (!input_dev) + /* keyboard */ + kbd = input_allocate_device(); + if (!kbd) goto error_nomem; - - input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL) | BIT(EV_ABS); - input_dev->keybit[LONG(BTN_MOUSE)] - = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT); - /* TODO additional buttons */ - input_dev->relbit[0] = BIT(REL_X) | BIT(REL_Y); - - /* FIXME not sure this is quite right */ - for (i = 0; i < 256; i++) - set_bit(i, input_dev->keybit); - - input_dev->name = "Xen Virtual Keyboard/Mouse"; - - input_set_abs_params(input_dev, ABS_X, 0, XENFB_WIDTH, 0, 0); - input_set_abs_params(input_dev, ABS_Y, 0, XENFB_HEIGHT, 0, 0); - - ret = input_register_device(input_dev); - if (ret) { - input_free_device(input_dev); - xenbus_dev_fatal(dev, ret, "input_register_device"); + kbd->name = "Xen Virtual Keyboard"; + kbd->phys = info->phys; + kbd->id.bustype = BUS_PCI; + kbd->id.vendor = 0x5853; + kbd->id.product = 0xffff; + kbd->evbit[0] = BIT(EV_KEY); + for (i = KEY_ESC; i < KEY_UNKNOWN; i++) + set_bit(i, kbd->keybit); + for (i = KEY_OK; i < KEY_MAX; i++) + set_bit(i, kbd->keybit); + + ret = input_register_device(kbd); + if (ret) { + input_free_device(kbd); + xenbus_dev_fatal(dev, ret, "input_register_device(kbd)"); goto error; } - info->dev = input_dev; + info->kbd = kbd; + + /* pointing device */ + ptr = input_allocate_device(); + if (!ptr) + goto error_nomem; + ptr->name = "Xen Virtual Pointer"; + ptr->phys = info->phys; + ptr->id.bustype = BUS_PCI; + ptr->id.vendor = 0x5853; + ptr->id.product = 0xfffe; + ptr->evbit[0] = BIT(EV_KEY) | BIT(EV_REL) | BIT(EV_ABS); + for (i = BTN_LEFT; i <= BTN_TASK; i++) + set_bit(i, ptr->keybit); + ptr->relbit[0] = BIT(REL_X) | BIT(REL_Y); + input_set_abs_params(ptr, ABS_X, 0, XENFB_WIDTH, 0, 0); + input_set_abs_params(ptr, ABS_Y, 0, XENFB_HEIGHT, 0, 0); + + ret = input_register_device(ptr); + if (ret) { + input_free_device(ptr); + xenbus_dev_fatal(dev, ret, "input_register_device(ptr)"); + goto error; + } + info->ptr = ptr; ret = xenkbd_connect_backend(dev, info); if (ret < 0) @@ -155,7 +191,8 @@ static int xenkbd_remove(struct xenbus_d struct xenkbd_info *info = dev->dev.driver_data; xenkbd_disconnect_backend(info); - input_unregister_device(info->dev); + input_unregister_device(info->kbd); + input_unregister_device(info->ptr); free_page((unsigned long)info->page); kfree(info); return 0; diff -r fbc233a1dc53 -r f9277e2548b5 linux-2.6-xen-sparse/include/asm-i386/a.out.h --- a/linux-2.6-xen-sparse/include/asm-i386/a.out.h Wed Feb 07 10:46:18 2007 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,26 +0,0 @@ -#ifndef __I386_A_OUT_H__ -#define __I386_A_OUT_H__ - -struct exec -{ - unsigned long a_info; /* Use macros N_MAGIC, etc for access */ - unsigned a_text; /* length of text, in bytes */ - unsigned a_data; /* length of data, in bytes */ - unsigned a_bss; /* length of uninitialized data area for file, in bytes */ - unsigned a_syms; /* length of symbol table data in file, in bytes */ - unsigned a_entry; /* start address */ - unsigned a_trsize; /* length of relocation info for text, in bytes */ - unsigned a_drsize; /* length of relocation info for data, in bytes */ -}; - -#define N_TRSIZE(a) ((a).a_trsize) -#define N_DRSIZE(a) ((a).a_drsize) -#define N_SYMSIZE(a) ((a).a_syms) - -#ifdef __KERNEL__ - -#define STACK_TOP (TASK_SIZE - 3*PAGE_SIZE) - -#endif - -#endif /* __A_OUT_GNU_H__ */ diff -r fbc233a1dc53 -r f9277e2548b5 linux-2.6-xen-sparse/net/core/skbuff.c --- a/linux-2.6-xen-sparse/net/core/skbuff.c Wed Feb 07 10:46:18 2007 -0700 +++ b/linux-2.6-xen-sparse/net/core/skbuff.c Thu Feb 08 17:27:30 2007 +0000 @@ -1897,6 +1897,29 @@ int skb_append_datato_frags(struct sock } /** + * skb_pull_rcsum - pull skb and update receive checksum + * @skb: buffer to update + * @start: start of data before pull + * @len: length of data pulled + * + * This function performs an skb_pull on the packet and updates + * update the CHECKSUM_HW checksum. It should be used on receive + * path processing instead of skb_pull unless you know that the + * checksum difference is zero (e.g., a valid IP header) or you + * are setting ip_summed to CHECKSUM_NONE. + */ +unsigned char *skb_pull_rcsum(struct sk_buff *skb, unsigned int len) +{ + BUG_ON(len > skb->len); + skb->len -= len; + BUG_ON(skb->len < skb->data_len); + skb_postpull_rcsum(skb, skb->data, len); + return skb->data += len; +} + +EXPORT_SYMBOL_GPL(skb_pull_rcsum); + +/** * skb_segment - Perform protocol segmentation on skb. * @skb: buffer to segment * @features: features for the output path (see dev->features) @@ -2021,29 +2044,6 @@ err: } EXPORT_SYMBOL_GPL(skb_segment); - -/** - * skb_pull_rcsum - pull skb and update receive checksum - * @skb: buffer to update - * @start: start of data before pull - * @len: length of data pulled - * - * This function performs an skb_pull on the packet and updates - * update the CHECKSUM_HW checksum. It should be used on receive - * path processing instead of skb_pull unless you know that the - * checksum difference is zero (e.g., a valid IP header) or you - * are setting ip_summed to CHECKSUM_NONE. - */ -unsigned char *skb_pull_rcsum(struct sk_buff *skb, unsigned int len) -{ - BUG_ON(len > skb->len); - skb->len -= len; - BUG_ON(skb->len < skb->data_len); - skb_postpull_rcsum(skb, skb->data, len); - return skb->data += len; -} - -EXPORT_SYMBOL_GPL(skb_pull_rcsum); void __init skb_init(void) { diff -r fbc233a1dc53 -r f9277e2548b5 tools/examples/vif-bridge --- a/tools/examples/vif-bridge Wed Feb 07 10:46:18 2007 -0700 +++ b/tools/examples/vif-bridge Thu Feb 08 17:27:30 2007 +0000 @@ -46,6 +46,13 @@ then fi fi +RET=0 +ip link show $bridge 1>/dev/null 2>&1 || RET=1 +if [ "$RET" -eq 1 ] +then + fatal "Could not find bridge device $bridge" +fi + case "$command" in online) setup_bridge_port "$vif" diff -r fbc233a1dc53 -r f9277e2548b5 tools/examples/xen-hotplug-common.sh --- a/tools/examples/xen-hotplug-common.sh Wed Feb 07 10:46:18 2007 -0700 +++ b/tools/examples/xen-hotplug-common.sh Thu Feb 08 17:27:30 2007 +0000 @@ -28,14 +28,15 @@ unset $(set | grep ^LC_ | cut -d= -f1) unset $(set | grep ^LC_ | cut -d= -f1) fatal() { - xenstore_write "$XENBUS_PATH"/hotplug-status error + xenstore_write "$XENBUS_PATH/hotplug-error" "$*" \ + "$XENBUS_PATH/hotplug-status" error log err "$@" exit 1 } success() { # Tell DevController that backend is "connected" - xenstore_write "$XENBUS_PATH"/hotplug-status connected + xenstore_write "$XENBUS_PATH/hotplug-status" connected } do_or_die() { diff -r fbc233a1dc53 -r f9277e2548b5 tools/ioemu/hw/cirrus_vga.c --- a/tools/ioemu/hw/cirrus_vga.c Wed Feb 07 10:46:18 2007 -0700 +++ b/tools/ioemu/hw/cirrus_vga.c Thu Feb 08 17:27:30 2007 +0000 @@ -3339,6 +3339,10 @@ void pci_cirrus_vga_init(PCIBus *bus, Di pci_conf[0x0a] = PCI_CLASS_SUB_VGA; pci_conf[0x0b] = PCI_CLASS_BASE_DISPLAY; pci_conf[0x0e] = PCI_CLASS_HEADERTYPE_00h; + pci_conf[0x2c] = 0x53; /* subsystem vendor: XenSource */ + pci_conf[0x2d] = 0x58; + pci_conf[0x2e] = 0x01; /* subsystem device */ + pci_conf[0x2f] = 0x00; /* setup VGA */ s = &d->cirrus_vga; diff -r fbc233a1dc53 -r f9277e2548b5 tools/ioemu/hw/ide.c --- a/tools/ioemu/hw/ide.c Wed Feb 07 10:46:18 2007 -0700 +++ b/tools/ioemu/hw/ide.c Thu Feb 08 17:27:30 2007 +0000 @@ -2502,6 +2502,10 @@ void pci_piix3_ide_init(PCIBus *bus, Blo pci_conf[0x0a] = 0x01; // class_sub = PCI_IDE pci_conf[0x0b] = 0x01; // class_base = PCI_mass_storage pci_conf[0x0e] = 0x00; // header_type + pci_conf[0x2c] = 0x53; /* subsystem vendor: XenSource */ + pci_conf[0x2d] = 0x58; + pci_conf[0x2e] = 0x01; /* subsystem device */ + pci_conf[0x2f] = 0x00; pci_register_io_region((PCIDevice *)d, 4, 0x10, PCI_ADDRESS_SPACE_IO, bmdma_map); diff -r fbc233a1dc53 -r f9277e2548b5 tools/ioemu/hw/rtl8139.c --- a/tools/ioemu/hw/rtl8139.c Wed Feb 07 10:46:18 2007 -0700 +++ b/tools/ioemu/hw/rtl8139.c Thu Feb 08 17:27:30 2007 +0000 @@ -3423,8 +3423,10 @@ void pci_rtl8139_init(PCIBus *bus, NICIn pci_conf[0x0e] = 0x00; /* header_type */ pci_conf[0x3d] = 1; /* interrupt pin 0 */ pci_conf[0x34] = 0xdc; - pci_conf[0x2c] = pci_conf[0x00]; // same as Vendor ID - pci_conf[0x2d] = pci_conf[0x01]; + pci_conf[0x2c] = 0x53; /* subsystem vendor: XenSource */ + pci_conf[0x2d] = 0x58; + pci_conf[0x2e] = 0x01; /* subsystem device */ + pci_conf[0x2f] = 0x00; s = &d->rtl8139; diff -r fbc233a1dc53 -r f9277e2548b5 tools/ioemu/xenstore.c --- a/tools/ioemu/xenstore.c Wed Feb 07 10:46:18 2007 -0700 +++ b/tools/ioemu/xenstore.c Thu Feb 08 17:27:30 2007 +0000 @@ -10,6 +10,7 @@ #include "vl.h" #include "block_int.h" +#include <unistd.h> static struct xs_handle *xsh = NULL; static char *hd_filename[MAX_DISKS]; @@ -52,11 +53,40 @@ void xenstore_check_new_media_present(in qemu_mod_timer(insert_timer, qemu_get_clock(rt_clock) + timeout); } +static int waitForDevice(char *path, char *field, char *desired) +{ + char *buf = NULL, *stat = NULL; + unsigned int len; + int val = 1; + + /* loop until we find a value in xenstore, return + * if it was what we wanted, or not + */ + while (1) { + if (pasprintf(&buf, "%s/%s", path, field) == -1) + goto done; + free(stat); + stat = xs_read(xsh, XBT_NULL, buf, &len); + if (stat == NULL) { + usleep(100000); /* 1/10th second, no path found */ + } else { + val = strcmp(stat, desired); + goto done; + } + } + +done: + free(stat); + free(buf); + return val; +} + void xenstore_parse_domain_config(int domid) { char **e = NULL; char *buf = NULL, *path; - char *bpath = NULL, *dev = NULL, *params = NULL, *type = NULL; + char *fpath = NULL, *bpath = NULL, + *dev = NULL, *params = NULL, *type = NULL; int i; unsigned int len, num, hd_index; @@ -120,7 +150,35 @@ void xenstore_parse_domain_config(int do hd_filename[hd_index] = params; /* strdup() */ params = NULL; /* don't free params on re-use */ } + /* + * check if device has a phantom vbd; the phantom is hooked + * to the frontend device (for ease of cleanup), so lookup + * the frontend device, and see if there is a phantom_vbd + * if there is, we will use resolution as the filename + */ + if (pasprintf(&buf, "%s/device/vbd/%s/phantom_vbd", path, e[i]) == -1) + continue; + free(fpath); + fpath = xs_read(xsh, XBT_NULL, buf, &len); + if (fpath != NULL) { + + if (waitForDevice(fpath, "hotplug-status", "connected")) { + continue; + } + + if (pasprintf(&buf, "%s/dev", fpath) == -1) + continue; + params = xs_read(xsh, XBT_NULL, buf , &len); + if (params != NULL) { + free(hd_filename[hd_index]); + hd_filename[hd_index] = params; + params = NULL; /* don't free params on re-use */ + } + } bs_table[hd_index] = bdrv_new(dev); + /* re-establish buf */ + if (pasprintf(&buf, "%s/params", bpath) == -1) + continue; /* check if it is a cdrom */ if (type && !strcmp(type, "cdrom")) { bdrv_set_type_hint(bs_table[hd_index], BDRV_TYPE_CDROM); diff -r fbc233a1dc53 -r f9277e2548b5 tools/libxc/xc_hvm_restore.c --- a/tools/libxc/xc_hvm_restore.c Wed Feb 07 10:46:18 2007 -0700 +++ b/tools/libxc/xc_hvm_restore.c Thu Feb 08 17:27:30 2007 +0000 @@ -69,7 +69,6 @@ int xc_hvm_restore(int xc_handle, int io int xc_hvm_restore(int xc_handle, int io_fd, uint32_t dom, unsigned long nr_pfns, unsigned int store_evtchn, unsigned long *store_mfn, - unsigned int console_evtchn, unsigned long *console_mfn, unsigned int pae, unsigned int apic) { DECLARE_DOMCTL; @@ -104,8 +103,8 @@ int xc_hvm_restore(int xc_handle, int io memsize = (unsigned long long)*store_mfn; v_end = memsize << 20; - DPRINTF("xc_hvm_restore:dom=%d, nr_pfns=0x%lx, store_evtchn=%d, *store_mfn=%ld, console_evtchn=%d, *console_mfn=%ld, pae=%u, apic=%u.\n", - dom, nr_pfns, store_evtchn, *store_mfn, console_evtchn, *console_mfn, pae, apic); + DPRINTF("xc_hvm_restore:dom=%d, nr_pfns=0x%lx, store_evtchn=%d, *store_mfn=%ld, pae=%u, apic=%u.\n", + dom, nr_pfns, store_evtchn, *store_mfn, pae, apic); max_pfn = nr_pfns; diff -r fbc233a1dc53 -r f9277e2548b5 tools/libxc/xc_hvm_save.c --- a/tools/libxc/xc_hvm_save.c Wed Feb 07 10:46:18 2007 -0700 +++ b/tools/libxc/xc_hvm_save.c Thu Feb 08 17:27:30 2007 +0000 @@ -27,6 +27,7 @@ #include <stdlib.h> #include <unistd.h> #include <sys/time.h> +#include <xen/hvm/e820.h> #include "xc_private.h" #include "xg_private.h" @@ -275,9 +276,8 @@ int xc_hvm_save(int xc_handle, int io_fd /* A copy of the CPU context of the guest. */ vcpu_guest_context_t ctxt; - /* A table containg the type of each PFN (/not/ MFN!). */ - unsigned long *pfn_type = NULL; - unsigned long *pfn_batch = NULL; + /* A table containg the PFNs (/not/ MFN!) to map. */ + xen_pfn_t *pfn_batch = NULL; /* A copy of hvm domain context buffer*/ uint32_t hvm_buf_size; @@ -290,7 +290,6 @@ int xc_hvm_save(int xc_handle, int io_fd unsigned char *region_base = NULL; uint32_t nr_pfns, rec_size, nr_vcpus; - unsigned long *page_array = NULL; /* power of 2 order of max_pfn */ int order_nr; @@ -361,18 +360,12 @@ int xc_hvm_save(int xc_handle, int io_fd goto out; } - max_pfn = live_shinfo->arch.max_pfn; - DPRINTF("saved hvm domain info:max_memkb=0x%lx, max_mfn=0x%lx, nr_pages=0x%lx\n", info.max_memkb, max_mfn, info.nr_pages); - /* nr_pfns: total pages excluding vga acc mem - * max_pfn: nr_pfns + 0x20 vga hole(0xa0~0xc0) - * getdomaininfo.tot_pages: all the allocated pages for this domain - */ if (live) { ERROR("hvm domain doesn't support live migration now.\n"); goto out; - + if (xc_shadow_control(xc_handle, dom, XEN_DOMCTL_SHADOW_OP_ENABLE_LOGDIRTY, NULL, 0, NULL, 0, NULL) < 0) { @@ -381,6 +374,7 @@ int xc_hvm_save(int xc_handle, int io_fd } /* excludes vga acc mem */ + /* XXX will need to check whether acceleration is enabled here! */ nr_pfns = info.nr_pages - 0x800; last_iter = 0; @@ -396,8 +390,8 @@ int xc_hvm_save(int xc_handle, int io_fd ERROR("HVM Domain appears not to have suspended"); goto out; } - nr_pfns = info.nr_pages; - DPRINTF("after suspend hvm domain nr_pages=0x%x.\n", nr_pfns); + + nr_pfns = info.nr_pages; } DPRINTF("after 1st handle hvm domain nr_pfns=0x%x, nr_pages=0x%lx, max_memkb=0x%lx, live=%d.\n", @@ -406,10 +400,15 @@ int xc_hvm_save(int xc_handle, int io_fd info.max_memkb, live); - nr_pfns = info.nr_pages; - - /*XXX: caculate the VGA hole*/ - max_pfn = nr_pfns + 0x20; + /* Calculate the highest PFN of "normal" memory: + * HVM memory is sequential except for the VGA and MMIO holes, and + * we have nr_pfns of it (which now excludes the cirrus video RAM) */ + max_pfn = nr_pfns; + /* Skip the VGA hole from 0xa0000 to 0xc0000 */ + max_pfn += 0x20; + /* Skip the MMIO hole: 256MB just below 4GB */ + if ( max_pfn >= (HVM_BELOW_4G_MMIO_START >> PAGE_SHIFT) ) + max_pfn += (HVM_BELOW_4G_MMIO_LENGTH >> PAGE_SHIFT); skip_this_iter = 0;/*XXX*/ /* pretend we sent all the pages last iteration */ @@ -424,7 +423,6 @@ int xc_hvm_save(int xc_handle, int io_fd to_send = malloc(BITMAP_SIZE); to_skip = malloc(BITMAP_SIZE); - page_array = (unsigned long *) malloc( sizeof(unsigned long) * max_pfn); hvm_buf_size = xc_domain_hvm_getcontext(xc_handle, dom, 0, 0); if ( hvm_buf_size == -1 ) @@ -434,7 +432,7 @@ int xc_hvm_save(int xc_handle, int io_fd } hvm_buf = malloc(hvm_buf_size); - if (!to_send ||!to_skip ||!page_array ||!hvm_buf) { + if (!to_send ||!to_skip ||!hvm_buf) { ERROR("Couldn't allocate memory"); goto out; } @@ -454,23 +452,13 @@ int xc_hvm_save(int xc_handle, int io_fd analysis_phase(xc_handle, dom, max_pfn, to_skip, 0); - /* get all the HVM domain pfns */ - for ( i = 0; i < max_pfn; i++) - page_array[i] = i; - /* We want zeroed memory so use calloc rather than malloc. */ - pfn_type = calloc(MAX_BATCH_SIZE, sizeof(*pfn_type)); pfn_batch = calloc(MAX_BATCH_SIZE, sizeof(*pfn_batch)); - if ((pfn_type == NULL) || (pfn_batch == NULL)) { - ERROR("failed to alloc memory for pfn_type and/or pfn_batch arrays"); + if (pfn_batch == NULL) { + ERROR("failed to alloc memory for pfn_batch array"); errno = ENOMEM; - goto out; - } - - if (lock_pages(pfn_type, MAX_BATCH_SIZE * sizeof(*pfn_type))) { - ERROR("Unable to lock"); goto out; } @@ -511,16 +499,15 @@ int xc_hvm_save(int xc_handle, int io_fd } - /* load pfn_type[] with the mfn of all the pages we're doing in + /* load pfn_batch[] with the mfn of all the pages we're doing in this batch. */ for (batch = 0; batch < MAX_BATCH_SIZE && N < max_pfn ; N++) { int n = permute(N, max_pfn, order_nr); if (debug) { - DPRINTF("%d pfn= %08lx mfn= %08lx %d \n", - iter, (unsigned long)n, page_array[n], - test_bit(n, to_send)); + DPRINTF("%d pfn= %08lx %d \n", + iter, (unsigned long)n, test_bit(n, to_send)); } if (!last_iter && test_bit(n, to_send)&& test_bit(n, to_skip)) @@ -530,10 +517,12 @@ int xc_hvm_save(int xc_handle, int io_fd (test_bit(n, to_send) && last_iter))) continue; - if (n >= 0xa0 && n < 0xc0) { -/* DPRINTF("get a vga hole pfn= %x.\n", n);*/ + /* Skip PFNs that aren't really there */ + if ((n >= 0xa0 && n < 0xc0) /* VGA hole */ + || (n >= (HVM_BELOW_4G_MMIO_START >> PAGE_SHIFT) + && n < (1ULL << 32) >> PAGE_SHIFT)) /* 4G MMIO hole */ continue; - } + /* ** we get here if: ** 1. page is marked to_send & hasn't already been re-dirtied @@ -541,7 +530,6 @@ int xc_hvm_save(int xc_handle, int io_fd */ pfn_batch[batch] = n; - pfn_type[batch] = page_array[n]; batch++; } @@ -573,7 +561,6 @@ int xc_hvm_save(int xc_handle, int io_fd goto out; } - sent_this_iter += batch; munmap(region_base, batch*PAGE_SIZE); @@ -723,9 +710,6 @@ int xc_hvm_save(int xc_handle, int io_fd } free(hvm_buf); - free(page_array); - - free(pfn_type); free(pfn_batch); free(to_send); free(to_skip); diff -r fbc233a1dc53 -r f9277e2548b5 tools/libxc/xenguest.h --- a/tools/libxc/xenguest.h Wed Feb 07 10:46:18 2007 -0700 +++ b/tools/libxc/xenguest.h Thu Feb 08 17:27:30 2007 +0000 @@ -58,8 +58,7 @@ int xc_linux_restore(int xc_handle, int */ int xc_hvm_restore(int xc_handle, int io_fd, uint32_t dom, unsigned long nr_pfns, unsigned int store_evtchn, - unsigned long *store_mfn, unsigned int console_evtchn, - unsigned long *console_mfn, + unsigned long *store_mfn, unsigned int pae, unsigned int apic); /** diff -r fbc233a1dc53 -r f9277e2548b5 tools/libxc/xg_private.c --- a/tools/libxc/xg_private.c Wed Feb 07 10:46:18 2007 -0700 +++ b/tools/libxc/xg_private.c Thu Feb 08 17:27:30 2007 +0000 @@ -210,8 +210,7 @@ __attribute__((weak)) __attribute__((weak)) int xc_hvm_restore(int xc_handle, int io_fd, uint32_t dom, unsigned long nr_pfns, unsigned int store_evtchn, - unsigned long *store_mfn, unsigned int console_evtchn, - unsigned long *console_mfn, + unsigned long *store_mfn, unsigned int pae, unsigned int apic) { errno = ENOSYS; diff -r fbc233a1dc53 -r f9277e2548b5 tools/misc/Makefile --- a/tools/misc/Makefile Wed Feb 07 10:46:18 2007 -0700 +++ b/tools/misc/Makefile Thu Feb 08 17:27:30 2007 +0000 @@ -9,7 +9,7 @@ CFLAGS += $(INCLUDES) HDRS = $(wildcard *.h) -TARGETS = xenperf xc_shadow +TARGETS = xenperf xc_shadow xen-detect INSTALL_BIN = $(TARGETS) xencons INSTALL_SBIN = netfix xm xen-bugtool xen-python-path xend xenperf @@ -41,5 +41,5 @@ clean: %.o: %.c $(HDRS) Makefile $(CC) -c $(CFLAGS) -o $@ $< -$(TARGETS): %: %.o Makefile +xenperf xc_shadow: %: %.o Makefile $(CC) $(CFLAGS) -o $@ $< -L$(XEN_LIBXC) -lxenctrl diff -r fbc233a1dc53 -r f9277e2548b5 tools/misc/xen-detect.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/misc/xen-detect.c Thu Feb 08 17:27:30 2007 +0000 @@ -0,0 +1,108 @@ +/****************************************************************************** + * xen_detect.c + * + * Simple GNU C / POSIX application to detect execution on Xen VMM platform. + * + * Copyright (c) 2007, XenSource Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/types.h> +#include <sys/wait.h> +#include <unistd.h> + +static int pv_context; + +static void cpuid(uint32_t idx, + uint32_t *eax, + uint32_t *ebx, + uint32_t *ecx, + uint32_t *edx) +{ + asm volatile ( + "test %1,%1 ; jz 1f ; ud2a ; .ascii \"xen\" ; 1: cpuid" + : "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx) + : "0" (idx), "1" (pv_context) ); +} + +static int check_for_xen(void) +{ + uint32_t eax, ebx, ecx, edx; + char signature[13]; + + cpuid(0x40000000, &eax, &ebx, &ecx, &edx); + *(uint32_t *)(signature + 0) = ebx; + *(uint32_t *)(signature + 4) = ecx; + *(uint32_t *)(signature + 8) = edx; + signature[12] = '\0'; + + if ( strcmp("XenVMMXenVMM", signature) || (eax < 0x40000002) ) + return 0; + + cpuid(0x40000001, &eax, &ebx, &ecx, &edx); + printf("Running in %s context on Xen v%d.%d.\n", + pv_context ? "PV" : "HVM", (uint16_t)(eax >> 16), (uint16_t)eax); + return 1; +} + +int main(void) +{ + pid_t pid; + int status; + uint32_t dummy; + + /* Check for execution in HVM context. */ + if ( check_for_xen() ) + return 0; + + /* Now we check for execution in PV context. */ + pv_context = 1; + + /* + * Fork a child to test the paravirtualised CPUID instruction. + * If executed outside Xen PV context, the extended opcode will fault. + */ + pid = fork(); + switch ( pid ) + { + case 0: + /* Child: test paravirtualised CPUID opcode and then exit cleanly. */ + cpuid(0x40000000, &dummy, &dummy, &dummy, &dummy); + exit(0); + case -1: + fprintf(stderr, "Fork failed.\n"); + return 0; + } + + /* + * Parent waits for child to terminate and checks for clean exit. + * Only if the exit is clean is it safe for us to try the extended CPUID. + */ + waitpid(pid, &status, 0); + if ( WIFEXITED(status) && check_for_xen() ) + return 0; + + printf("Not running on Xen.\n"); + return 0; +} diff -r fbc233a1dc53 -r f9277e2548b5 tools/python/xen/xend/XendCheckpoint.py --- a/tools/python/xen/xend/XendCheckpoint.py Wed Feb 07 10:46:18 2007 -0700 +++ b/tools/python/xen/xend/XendCheckpoint.py Thu Feb 08 17:27:30 2007 +0000 @@ -239,8 +239,11 @@ def restore(xd, fd, dominfo = None, paus forkHelper(cmd, fd, handler.handler, True) - if handler.store_mfn is None or handler.console_mfn is None: - raise XendError('Could not read store/console MFN') + if handler.store_mfn is None: + raise XendError('Could not read store MFN') + + if not is_hvm and handler.console_mfn is None: + raise XendError('Could not read console MFN') dominfo.waitForDevices() # Wait for backends to set up if not paused: diff -r fbc233a1dc53 -r f9277e2548b5 tools/python/xen/xend/XendConfig.py --- a/tools/python/xen/xend/XendConfig.py Wed Feb 07 10:46:18 2007 -0700 +++ b/tools/python/xen/xend/XendConfig.py Thu Feb 08 17:27:30 2007 +0000 @@ -1148,6 +1148,47 @@ class XendConfig(dict): # no valid device to add return '' + def phantom_device_add(self, dev_type, cfg_xenapi = None, + target = None): + """Add a phantom tap device configuration in XenAPI struct format. + """ + + if target == None: + target = self + + if dev_type not in XendDevices.valid_devices() and \ + dev_type not in XendDevices.pseudo_devices(): + raise XendConfigError("XendConfig: %s not a valid device type" % + dev_type) + + if cfg_xenapi == None: + raise XendConfigError("XendConfig: device_add requires some " + "config.") + + if cfg_xenapi: + log.debug("XendConfig.phantom_device_add: %s" % str(cfg_xenapi)) + + if cfg_xenapi: + dev_info = {} + if dev_type in ('vbd', 'tap'): + if dev_type == 'vbd': + dev_info['uname'] = cfg_xenapi.get('image', '') + dev_info['dev'] = '%s:disk' % cfg_xenapi.get('device') + elif dev_type == 'tap': + if cfg_xenapi.get('image').find('tap:') == -1: + dev_info['uname'] = 'tap:qcow:%s' % cfg_xenapi.get('image') + dev_info['dev'] = '/dev/%s' % cfg_xenapi.get('device') + dev_info['uname'] = cfg_xenapi.get('image') + dev_info['mode'] = cfg_xenapi.get('mode') + dev_info['backend'] = '0' + dev_uuid = cfg_xenapi.get('uuid', uuid.createString()) + dev_info['uuid'] = dev_uuid + self['devices'][dev_uuid] = (dev_type, dev_info) + self['vbd_refs'].append(dev_uuid) + return dev_uuid + + return '' + def console_add(self, protocol, location, other_config = {}): dev_uuid = uuid.createString() if protocol == 'vt100': diff -r fbc233a1dc53 -r f9277e2548b5 tools/python/xen/xend/XendDomain.py --- a/tools/python/xen/xend/XendDomain.py Wed Feb 07 10:46:18 2007 -0700 +++ b/tools/python/xen/xend/XendDomain.py Thu Feb 08 17:27:30 2007 +0000 @@ -800,7 +800,10 @@ class XendDomain: "support.") path = self._managed_check_point_path(dom_uuid) - fd = os.open(path, os.O_WRONLY | os.O_CREAT | os.O_TRUNC) + oflags = os.O_WRONLY | os.O_CREAT | os.O_TRUNC + if hasattr(os, "O_LARGEFILE"): + oflags |= os.O_LARGEFILE + fd = os.open(path, oflags) try: # For now we don't support 'live checkpoint' XendCheckpoint.save(fd, dominfo, False, False, path) @@ -840,8 +843,11 @@ class XendDomain: # Restore that replaces the existing XendDomainInfo try: log.debug('Current DomainInfo state: %d' % dominfo.state) + oflags = os.O_RDONLY + if hasattr(os, "O_LARGEFILE"): + oflags |= os.O_LARGEFILE XendCheckpoint.restore(self, - os.open(chkpath, os.O_RDONLY), + os.open(chkpath, oflags), dominfo, paused = start_paused) os.unlink(chkpath) @@ -1009,7 +1015,10 @@ class XendDomain: @raise XendError: Failure to restore domain """ try: - fd = os.open(src, os.O_RDONLY) + oflags = os.O_RDONLY + if hasattr(os, "O_LARGEFILE"): + oflags |= os.O_LARGEFILE + fd = os.open(src, oflags) try: return self.domain_restore_fd(fd, paused=paused) finally: @@ -1193,7 +1202,10 @@ class XendDomain: if dominfo.getDomid() == DOM0_ID: raise XendError("Cannot save privileged domain %i" % domid) - fd = os.open(dst, os.O_WRONLY | os.O_CREAT | os.O_TRUNC) + oflags = os.O_WRONLY | os.O_CREAT | os.O_TRUNC + if hasattr(os, "O_LARGEFILE"): + oflags |= os.O_LARGEFILE + fd = os.open(dst, oflags) try: # For now we don't support 'live checkpoint' XendCheckpoint.save(fd, dominfo, False, False, dst) diff -r fbc233a1dc53 -r f9277e2548b5 tools/python/xen/xend/XendDomainInfo.py --- a/tools/python/xen/xend/XendDomainInfo.py Wed Feb 07 10:46:18 2007 -0700 +++ b/tools/python/xen/xend/XendDomainInfo.py Thu Feb 08 17:27:30 2007 +0000 @@ -1416,7 +1416,7 @@ class XendDomainInfo: self.info['image'], self.info['devices']) - localtime = self.info.get('localtime', False) + localtime = self.info.get('platform_localtime', False) if localtime: xc.domain_set_time_offset(self.domid) @@ -1565,18 +1565,53 @@ class XendDomainInfo: # VM Destroy # + def _prepare_phantom_paths(self): + # get associated devices to destroy + # build list of phantom devices to be removed after normal devices + plist = [] + from xen.xend.xenstore.xstransact import xstransact + t = xstransact("%s/device/vbd" % GetDomainPath(self.domid)) + for dev in t.list(): + backend_phantom_vbd = xstransact.Read("%s/device/vbd/%s/phantom_vbd" \ + % (self.dompath, dev)) + if backend_phantom_vbd is not None: + frontend_phantom_vbd = xstransact.Read("%s/frontend" \ + % backend_phantom_vbd) + plist.append(backend_phantom_vbd) + plist.append(frontend_phantom_vbd) + return plist + + def _cleanup_phantom_devs(self, plist): + # remove phantom devices + if not plist == []: + time.sleep(2) + for paths in plist: + if paths.find('backend') != -1: + from xen.xend.server import DevController + # Modify online status /before/ updating state (latter is watched by + # drivers, so this ordering avoids a race). + xstransact.Write(paths, 'online', "0") + xstransact.Write(paths, 'state', str(DevController.xenbusState['Closing'])) + # force + xstransact.Remove(paths) + def destroy(self): """Cleanup VM and destroy domain. Nothrow guarantee.""" log.debug("XendDomainInfo.destroy: domid=%s", str(self.domid)) + + paths = self._prepare_phantom_paths() self._cleanupVm() if self.dompath is not None: self.destroyDomain() + self._cleanup_phantom_devs(paths) def destroyDomain(self): log.debug("XendDomainInfo.destroyDomain(%s)", str(self.domid)) + + paths = self._prepare_phantom_paths() try: if self.domid is not None: @@ -1591,7 +1626,7 @@ class XendDomainInfo: XendDomain.instance().remove_domain(self) self.cleanupDomain() - + self._cleanup_phantom_devs(paths) def resumeDomain(self): log.debug("XendDomainInfo.resumeDomain(%s)", str(self.domid)) @@ -2211,6 +2246,25 @@ class XendDomainInfo: return dev_uuid + def create_phantom_vbd_with_vdi(self, xenapi_vbd, vdi_image_path): + """Create a VBD using a VDI from XendStorageRepository. + + @param xenapi_vbd: vbd struct from the Xen API + @param vdi_image_path: VDI UUID + @rtype: string + @return: uuid of the device + """ + xenapi_vbd['image'] = vdi_image_path + dev_uuid = self.info.phantom_device_add('tap', cfg_xenapi = xenapi_vbd) + if not dev_uuid: + raise XendError('Failed to create device') + + if self.state == XEN_API_VM_POWER_STATE_RUNNING: + _, config = self.info['devices'][dev_uuid] + config['devid'] = self.getDeviceController('tap').createDevice(config) + + return config['devid'] + def create_vif(self, xenapi_vif): """Create VIF device from the passed struct in Xen API format. diff -r fbc233a1dc53 -r f9277e2548b5 tools/python/xen/xend/server/BlktapController.py --- a/tools/python/xen/xend/server/BlktapController.py Wed Feb 07 10:46:18 2007 -0700 +++ b/tools/python/xen/xend/server/BlktapController.py Thu Feb 08 17:27:30 2007 +0000 @@ -2,7 +2,10 @@ from xen.xend.server.blkif import BlkifController +from xen.xend.XendLogging import log +phantomDev = 0; +phantomId = 0; class BlktapController(BlkifController): def __init__(self, vm): @@ -12,3 +15,62 @@ class BlktapController(BlkifController): """@see DevController#frontendRoot""" return "%s/device/vbd" % self.vm.getDomainPath() + + def getDeviceDetails(self, config): + (devid, back, front) = BlkifController.getDeviceDetails(self, config) + + phantomDevid = 0 + wrapped = False + + try: + imagetype = self.vm.info['image']['type'] + except: + imagetype = "" + + if imagetype == 'hvm': + tdevname = back['dev'] + index = ['c', 'd', 'e', 'f', 'g', 'h', 'i', \ + 'j', 'l', 'm', 'n', 'o', 'p'] + while True: + global phantomDev + global phantomId + import os, stat + + phantomId = phantomId + 1 + if phantomId == 16: + if index[phantomDev] == index[-1]: + if wrapped: + raise VmError(" No loopback block \ + devices are available. ") + wrapped = True + phantomDev = 0 + else: + phantomDev = phantomDev + 1 + phantomId = 1 + devname = 'xvd%s%d' % (index[phantomDev], phantomId) + try: + info = os.stat('/dev/%s' % devname) + except: + break + + vbd = { 'mode': 'w', 'device': devname } + fn = 'tap:%s' % back['params'] + + # recurse ... by creating the vbd, then fallthrough + # and finish creating the original device + + from xen.xend import XendDomain + dom0 = XendDomain.instance().privilegedDomain() + phantomDevid = dom0.create_phantom_vbd_with_vdi(vbd, fn) + # we need to wait for this device at a higher level + # the vbd that gets created will have a link to us + # and will let them do it there + + # add a hook to point to the phantom device, + # root path is always the same (dom0 tap) + if phantomDevid != 0: + front['phantom_vbd'] = '/local/domain/0/backend/tap/0/%s' \ + % str(phantomDevid) + + return (devid, back, front) + diff -r fbc233a1dc53 -r f9277e2548b5 tools/python/xen/xend/server/DevController.py --- a/tools/python/xen/xend/server/DevController.py Wed Feb 07 10:46:18 2007 -0700 +++ b/tools/python/xen/xend/server/DevController.py Thu Feb 08 17:27:30 2007 +0000 @@ -153,9 +153,9 @@ class DevController: log.debug("Waiting for %s.", devid) if not self.hotplug: - return - - status = self.waitForBackend(devid) + return + + (status, err) = self.waitForBackend(devid) if status == Timeout: self.destroyDevice(devid, False) @@ -165,25 +165,22 @@ class DevController: elif status == Error: self.destroyDevice(devid, False) - raise VmError("Device %s (%s) could not be connected. " - "Backend device not found." % - (devid, self.deviceClass)) - + if err is None: + raise VmError("Device %s (%s) could not be connected. " + "Backend device not found." % + (devid, self.deviceClass)) + else: + raise VmError("Device %s (%s) could not be connected. " + "%s" % (devid, self.deviceClass, err)) elif status == Missing: # Don't try to destroy the device; it's already gone away. raise VmError("Device %s (%s) could not be connected. " "Device not found." % (devid, self.deviceClass)) elif status == Busy: - err = None - frontpath = self.frontendPath(devid) - backpath = xstransact.Read(frontpath, "backend") - if backpath: - err = xstransact.Read(backpath, HOTPLUG_ERROR_NODE) - if not err: + self.destroyDevice(devid, False) + if err is None: err = "Busy." - - self.destroyDevice(devid, False) raise VmError("Device %s (%s) could not be connected.\n%s" % (devid, self.deviceClass, err)) @@ -476,19 +473,36 @@ class DevController: def waitForBackend(self, devid): frontpath = self.frontendPath(devid) + # lookup a phantom + phantomPath = xstransact.Read(frontpath, 'phantom_vbd') + if phantomPath is not None: + log.debug("Waiting for %s's phantom %s.", devid, phantomPath) + statusPath = phantomPath + '/' + HOTPLUG_STATUS_NODE + ev = Event() + result = { 'status': Timeout } + xswatch(statusPath, hotplugStatusCallback, ev, result) + ev.wait(DEVICE_CREATE_TIMEOUT) + err = xstransact.Read(statusPath, HOTPLUG_ERROR_NODE) + if result['status'] != 'Connected': + return (result['status'], err) + backpath = xstransact.Read(frontpath, "backend") + if backpath: statusPath = backpath + '/' + HOTPLUG_STATUS_NODE ev = Event() result = { 'status': Timeout } - + xswatch(statusPath, hotplugStatusCallback, ev, result) ev.wait(DEVICE_CREATE_TIMEOUT) - return result['status'] - else: - return Missing + + err = xstransact.Read(backpath, HOTPLUG_ERROR_NODE) + + return (result['status'], err) + else: + return (Missing, None) def backendPath(self, backdom, devid): diff -r fbc233a1dc53 -r f9277e2548b5 tools/xcutils/xc_restore.c --- a/tools/xcutils/xc_restore.c Wed Feb 07 10:46:18 2007 -0700 +++ b/tools/xcutils/xc_restore.c Thu Feb 08 17:27:30 2007 +0000 @@ -45,14 +45,15 @@ main(int argc, char **argv) /* pass the memsize to xc_hvm_restore to find the store_mfn */ store_mfn = hvm; ret = xc_hvm_restore(xc_fd, io_fd, domid, nr_pfns, store_evtchn, - &store_mfn, console_evtchn, &console_mfn, pae, apic); + &store_mfn, pae, apic); } else ret = xc_linux_restore(xc_fd, io_fd, domid, nr_pfns, store_evtchn, &store_mfn, console_evtchn, &console_mfn); if (ret == 0) { printf("store-mfn %li\n", store_mfn); - printf("console-mfn %li\n", console_mfn); + if (!hvm) + printf("console-mfn %li\n", console_mfn); fflush(stdout); } diff -r fbc233a1dc53 -r f9277e2548b5 tools/xenfb/vncfb.c --- a/tools/xenfb/vncfb.c Wed Feb 07 10:46:18 2007 -0700 +++ b/tools/xenfb/vncfb.c Thu Feb 08 17:27:30 2007 +0000 @@ -57,7 +57,8 @@ static void *kbd_layout; static void *kbd_layout; static int btnmap[] = { - BTN_LEFT, BTN_MIDDLE, BTN_RIGHT, BTN_FORWARD, BTN_BACK + BTN_LEFT, BTN_MIDDLE, BTN_RIGHT, BTN_SIDE, + BTN_EXTRA, BTN_FORWARD, BTN_BACK, BTN_TASK }; static void on_kbd_event(rfbBool down, rfbKeySym keycode, rfbClientPtr cl) @@ -73,11 +74,12 @@ static void on_kbd_event(rfbBool down, r */ rfbScreenInfoPtr server = cl->screen; struct xenfb *xenfb = server->screenData; - - if( keycode >= 'A' && keycode <= 'Z' ) + int scancode; + + if (keycode >= 'A' && keycode <= 'Z') keycode += 'a' - 'A'; - int scancode = keycode_table[keysym2scancode(kbd_layout, keycode)]; + scancode = keycode_table[keysym2scancode(kbd_layout, keycode)]; if (scancode == 0) return; if (xenfb_send_key(xenfb, down, scancode) < 0) diff -r fbc233a1dc53 -r f9277e2548b5 xen/arch/powerpc/machine_kexec.c --- a/xen/arch/powerpc/machine_kexec.c Wed Feb 07 10:46:18 2007 -0700 +++ b/xen/arch/powerpc/machine_kexec.c Thu Feb 08 17:27:30 2007 +0000 @@ -19,6 +19,11 @@ void machine_reboot_kexec(xen_kexec_imag printk("STUB: " __FILE__ ": %s: not implemented\n", __FUNCTION__); } +void machine_kexec(xen_kexec_image_t *image) +{ + printk("STUB: " __FILE__ ": %s: not implemented\n", __FUNCTION__); +} + /* * Local variables: * mode: C diff -r fbc233a1dc53 -r f9277e2548b5 xen/arch/x86/crash.c --- a/xen/arch/x86/crash.c Wed Feb 07 10:46:18 2007 -0700 +++ b/xen/arch/x86/crash.c Thu Feb 08 17:27:30 2007 +0000 @@ -11,7 +11,6 @@ #include <asm/atomic.h> #include <asm/elf.h> #include <asm/percpu.h> -#include <asm/kexec.h> #include <xen/types.h> #include <xen/irq.h> #include <asm/ipi.h> diff -r fbc233a1dc53 -r f9277e2548b5 xen/arch/x86/hvm/hvm.c --- a/xen/arch/x86/hvm/hvm.c Wed Feb 07 10:46:18 2007 -0700 +++ b/xen/arch/x86/hvm/hvm.c Thu Feb 08 17:27:30 2007 +0000 @@ -106,7 +106,6 @@ void hvm_migrate_timers(struct vcpu *v) pit_migrate_timers(v); rtc_migrate_timers(v); hpet_migrate_timers(v); - pmtimer_migrate_timers(v); if ( vcpu_vlapic(v)->pt.enabled ) migrate_timer(&vcpu_vlapic(v)->pt.timer, v->processor); } @@ -170,7 +169,6 @@ void hvm_domain_destroy(struct domain *d { pit_deinit(d); rtc_deinit(d); - pmtimer_deinit(d); hpet_deinit(d); if ( d->arch.hvm_domain.shared_page_va ) diff -r fbc233a1dc53 -r f9277e2548b5 xen/arch/x86/hvm/pmtimer.c --- a/xen/arch/x86/hvm/pmtimer.c Wed Feb 07 10:46:18 2007 -0700 +++ b/xen/arch/x86/hvm/pmtimer.c Thu Feb 08 17:27:30 2007 +0000 @@ -1,17 +1,6 @@ #include <asm/hvm/vpt.h> #include <asm/hvm/io.h> #include <asm/hvm/support.h> - -#define TMR_STS (1 << 0) -static void pmt_update_status(void *opaque) -{ - PMTState *s = opaque; - s->pm1_status |= TMR_STS; - - /* TODO: When TMR_EN == 1, generate a SCI event */ - - set_timer(&s->timer, NOW() + (1000000000ULL << 31) / FREQUENCE_PMTIMER); -} static int handle_pmt_io(ioreq_t *p) { @@ -30,42 +19,62 @@ static int handle_pmt_io(ioreq_t *p) /* PM_TMR_BLK is read-only */ return 1; } else if (p->dir == 1) { /* read */ + /* Set the correct value in the timer, accounting for time + * elapsed since the last time we did that. */ curr_gtime = hvm_get_guest_time(s->vcpu); - s->pm1_timer += ((curr_gtime - s->last_gtime) * s->scale) >> 32; - p->data = s->pm1_timer; + s->pm.timer += ((curr_gtime - s->last_gtime) * s->scale) >> 32; + p->data = s->pm.timer; s->last_gtime = curr_gtime; return 1; } return 0; } +static int pmtimer_save(struct domain *d, hvm_domain_context_t *h) +{ + PMTState *s = &d->arch.hvm_domain.pl_time.vpmt; + uint32_t x; + + /* Update the counter to the guest's current time. We always save + * with the domain paused, so the saved time should be after the + * last_gtime, but just in case, make sure we only go forwards */ + x = ((s->vcpu->arch.hvm_vcpu.guest_time - s->last_gtime) * s->scale) >> 32; + if ( x < 1UL<<31 ) + s->pm.timer += x; + return hvm_save_entry(PMTIMER, 0, h, &s->pm); +} + +static int pmtimer_load(struct domain *d, hvm_domain_context_t *h) +{ + PMTState *s = &d->arch.hvm_domain.pl_time.vpmt; + + /* Reload the counter */ + if ( hvm_load_entry(PMTIMER, h, &s->pm) ) + return -EINVAL; + + /* Calculate future counter values from now. */ + s->last_gtime = hvm_get_guest_time(s->vcpu); + + return 0; +} + +HVM_REGISTER_SAVE_RESTORE(PMTIMER, pmtimer_save, pmtimer_load, + 1, HVMSR_PER_DOM); + + void pmtimer_init(struct vcpu *v, int base) { PMTState *s = &v->domain->arch.hvm_domain.pl_time.vpmt; - s->pm1_timer = 0; - s->pm1_status = 0; + s->pm.timer = 0; s->scale = ((uint64_t)FREQUENCE_PMTIMER << 32) / ticks_per_sec(v); s->vcpu = v; - init_timer(&s->timer, pmt_update_status, s, v->processor); - /* ACPI supports a 32-bit power management timer */ - set_timer(&s->timer, NOW() + (1000000000ULL << 31) / FREQUENCE_PMTIMER); - + /* Not implemented: we should set TMR_STS (bit 0 of PM1a_STS) every + * time the timer's top bit flips, and generate an SCI if TMR_EN + * (bit 0 of PM1a_EN) is set. For now, those registers are in + * qemu-dm, and we just calculate the timer's value on demand. */ + register_portio_handler(v->domain, base, 4, handle_pmt_io); } -void pmtimer_migrate_timers(struct vcpu *v) -{ - struct PMTState *vpmt = &v->domain->arch.hvm_domain.pl_time.vpmt; - - if (vpmt->vcpu == v) - migrate_timer(&vpmt->timer, v->processor); -} - -void pmtimer_deinit(struct domain *d) -{ - PMTState *s = &d->arch.hvm_domain.pl_time.vpmt; - - kill_timer(&s->timer); -} diff -r fbc233a1dc53 -r f9277e2548b5 xen/arch/x86/machine_kexec.c --- a/xen/arch/x86/machine_kexec.c Wed Feb 07 10:46:18 2007 -0700 +++ b/xen/arch/x86/machine_kexec.c Thu Feb 08 17:27:30 2007 +0000 @@ -15,10 +15,14 @@ #include <xen/types.h> #include <xen/console.h> #include <xen/kexec.h> -#include <asm/kexec.h> #include <xen/domain_page.h> #include <asm/fixmap.h> #include <asm/hvm/hvm.h> + +typedef void (*relocate_new_kernel_t)( + unsigned long indirection_page, + unsigned long *page_list, + unsigned long start_address); int machine_kexec_load(int type, int slot, xen_kexec_image_t *image) { @@ -40,8 +44,26 @@ int machine_kexec_load(int type, int slo else { /* Odd pages: va for previous ma. */ - set_fixmap(fix_base + (k >> 1), prev_ma); - image->page_list[k] = fix_to_virt(fix_base + (k >> 1)); + if ( IS_COMPAT(dom0) ) + { + + /* + * The compatability bounce code sets up a page table + * with a 1-1 mapping of the first 1G of memory so + * VA==PA here. + * + * This Linux purgatory code still sets up separate + * high and low mappings on the control page (entries + * 0 and 1) but it is harmless if they are equal since + * that PT is not live at the time. + */ + image->page_list[k] = prev_ma; + } + else + { + set_fixmap(fix_base + (k >> 1), prev_ma); + image->page_list[k] = fix_to_virt(fix_base + (k >> 1)); + } } } @@ -94,6 +116,31 @@ void machine_reboot_kexec(xen_kexec_imag BUG(); } +void machine_kexec(xen_kexec_image_t *image) +{ +#ifdef CONFIG_COMPAT + if ( IS_COMPAT(dom0) ) + { + extern void compat_machine_kexec(unsigned long rnk, + unsigned long indirection_page, + unsigned long *page_list, + unsigned long start_address); + compat_machine_kexec(image->page_list[1], + image->indirection_page, + image->page_list, + image->start_address); + } + else +#endif + { + relocate_new_kernel_t rnk; + + rnk = (relocate_new_kernel_t) image->page_list[1]; + (*rnk)(image->indirection_page, image->page_list, + image->start_address); + } +} + /* * Local variables: * mode: C diff -r fbc233a1dc53 -r f9277e2548b5 xen/arch/x86/x86_64/Makefile --- a/xen/arch/x86/x86_64/Makefile Wed Feb 07 10:46:18 2007 -0700 +++ b/xen/arch/x86/x86_64/Makefile Thu Feb 08 17:27:30 2007 +0000 @@ -1,4 +1,5 @@ obj-y += entry.o obj-y += entry.o +obj-y += compat_kexec.o obj-y += gpr_switch.o obj-y += mm.o obj-y += traps.o diff -r fbc233a1dc53 -r f9277e2548b5 xen/arch/x86/x86_64/compat_kexec.S --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xen/arch/x86/x86_64/compat_kexec.S Thu Feb 08 17:27:30 2007 +0000 @@ -0,0 +1,126 @@ +/* + * Compatibility kexec handler. + */ + +#include <xen/config.h> + +#include <asm/asm_defns.h> +#include <asm/msr.h> +#include <asm/page.h> + +.text + + .code64 + +ENTRY(compat_machine_kexec) + /* x86/64 x86/32 */ + /* %rdi - relocate_new_kernel_t CALL */ + /* %rsi - indirection page 4(%esp) */ + /* %rdx - page_list 8(%esp) */ + /* %rcx - start address 12(%esp) */ + /* cpu has pae 16(%esp) */ + + /* Shim the 64 bit page_list into a 32 bit page_list. */ + mov $12,%r9 + lea compat_page_list(%rip), %rbx +1: dec %r9 + movl (%rdx,%r9,8),%eax + movl %eax,(%rbx,%r9,4) + test %r9,%r9 + jnz 1b + + movq %rbx,%rdx + mov $__PAGE_OFFSET,%rbx + sub %rbx, %rdx + + /* + * Setup an identity mapped region in PML4[0] of idle page + * table. + */ + lea idle_pg_table_l3(%rip),%rax + sub %rbx,%rax + or $0x63,%rax + mov %rax, idle_pg_table(%rip) + + /* Switch to idle page table. */ + movq $(idle_pg_table - __PAGE_OFFSET), %rax + movq %rax, %cr3 + + /* Jump to low identity mapping in compatibility mode. */ + ljmp *compatibility_mode_far(%rip) + ud2 + +compatibility_mode_far: + .long compatibility_mode - __PAGE_OFFSET + .long __HYPERVISOR_CS32 + + .code32 + +compatibility_mode: + /* Setup some sane segments. */ + movl $__HYPERVISOR_DS32, %eax + movl %eax, %ds + movl %eax, %es + movl %eax, %fs + movl %eax, %gs + movl %eax, %ss + + /* Push arguments onto stack. */ + pushl $1 /* 16(%esp) - cpu has pae */ + pushl %ecx /* 12(%esp) - start address */ + pushl %edx /* 8(%esp) - page list */ + pushl %esi /* 4(%esp) - indirection page */ + pushl %edi /* 0(%esp) - CALL */ + + /* Disable paging and therefore leave 64 bit mode. */ + movl %cr0, %eax + andl $~X86_CR0_PG, %eax + movl %eax, %cr0 + + /* Switch to 32 bit page table. */ + movl $compat_pg_table - __PAGE_OFFSET, %eax + movl %eax, %cr3 + + /* Clear MSR_EFER[LME], disabling long mode */ + movl $MSR_EFER,%ecx + rdmsr + btcl $_EFER_LME,%eax + wrmsr + + /* Re-enable paging, but only 32 bit mode now. */ + movl %cr0, %eax + orl $X86_CR0_PG, %eax + movl %eax, %cr0 + + popl %eax + call *%eax + ud2 + +compat_page_list: + .fill 12,4,0 + + .align 32,0 + + /* + * These compat page tables contain an identity mapping of the + * first 1G of the physical address space. + */ +compat_pg_table: + .long compat_pg_table_l2 + 0*PAGE_SIZE + 0x01 - __PAGE_OFFSET, 0 + .long 0, 0 + .long 0, 0 + .long 0, 0 + + .align 4096,0 + +compat_pg_table_l2: + .macro identmap from=0, count=512 + .if \count-1 + identmap "(\from+0)","(\count/2)" + identmap "(\from+(0x200000*(\count/2)))","(\count/2)" + .else + .quad 0x00000000000000e3 + \from + .endif + .endm + + identmap diff -r fbc233a1dc53 -r f9277e2548b5 xen/common/kexec.c --- a/xen/common/kexec.c Wed Feb 07 10:46:18 2007 -0700 +++ b/xen/common/kexec.c Thu Feb 08 17:27:30 2007 +0000 @@ -6,7 +6,6 @@ * - Magnus Damm <magnus@xxxxxxxxxxxxx> */ -#include <asm/kexec.h> #include <xen/lib.h> #include <xen/ctype.h> #include <xen/errno.h> diff -r fbc233a1dc53 -r f9277e2548b5 xen/common/memory.c --- a/xen/common/memory.c Wed Feb 07 10:46:18 2007 -0700 +++ b/xen/common/memory.c Thu Feb 08 17:27:30 2007 +0000 @@ -175,11 +175,13 @@ int guest_remove_page(struct domain *d, if ( unlikely(!page_is_removable(page)) ) { + shadow_drop_references(d, page); /* We'll make this a guest-visible error in future, so take heed! */ - gdprintk(XENLOG_INFO, "Dom%d freeing in-use page %lx (pseudophys %lx):" - " count=%lx type=%lx\n", - d->domain_id, mfn, get_gpfn_from_mfn(mfn), - (unsigned long)page->count_info, page->u.inuse.type_info); + if ( !page_is_removable(page) ) + gdprintk(XENLOG_INFO, "Dom%d freeing in-use page %lx " + "(pseudophys %lx): count=%lx type=%lx\n", + d->domain_id, mfn, get_gpfn_from_mfn(mfn), + (unsigned long)page->count_info, page->u.inuse.type_info); } guest_physmap_remove_page(d, gmfn, mfn); diff -r fbc233a1dc53 -r f9277e2548b5 xen/drivers/char/console.c --- a/xen/drivers/char/console.c Wed Feb 07 10:46:18 2007 -0700 +++ b/xen/drivers/char/console.c Thu Feb 08 17:27:30 2007 +0000 @@ -223,7 +223,7 @@ int console_steal(int handle, void (*fn) if ( (handle == -1) || (handle != sercon_handle) ) return 0; - if ( serial_steal_fn == NULL ) + if ( serial_steal_fn != NULL ) return -EBUSY; serial_steal_fn = fn; diff -r fbc233a1dc53 -r f9277e2548b5 xen/include/asm-ia64/kexec.h --- a/xen/include/asm-ia64/kexec.h Wed Feb 07 10:46:18 2007 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,25 +0,0 @@ -#ifndef __IA64_KEXEC_H__ -#define __IA64_KEXEC_H__ - -#include <xen/lib.h> /* for printk() used in stub */ -#include <xen/types.h> -#include <public/xen.h> -#include <xen/kexec.h> - -static inline void machine_kexec(xen_kexec_image_t *image) -{ - printk("STUB: " __FILE__ ": %s: not implemented\n", __FUNCTION__); -} - -#endif /* __IA64_KEXEC_H__ */ - -/* - * Local variables: - * mode: C - * c-set-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ - diff -r fbc233a1dc53 -r f9277e2548b5 xen/include/asm-powerpc/kexec.h --- a/xen/include/asm-powerpc/kexec.h Wed Feb 07 10:46:18 2007 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,25 +0,0 @@ -#ifndef _ASM_KEXEC_H__ -#define _ASM_KEXEC_H__ - -#include <xen/lib.h> /* for printk() used in stub */ -#include <xen/types.h> -#include <public/xen.h> -#include <xen/kexec.h> - -static inline void machine_kexec(xen_kexec_image_t *image) -{ - printk("STUB: " __FILE__ ": %s: not implemented\n", __FUNCTION__); -} - -#endif /* _ASM_KEXEC_H__ */ - -/* - * Local variables: - * mode: C - * c-set-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ - diff -r fbc233a1dc53 -r f9277e2548b5 xen/include/asm-x86/config.h --- a/xen/include/asm-x86/config.h Wed Feb 07 10:46:18 2007 -0700 +++ b/xen/include/asm-x86/config.h Thu Feb 08 17:27:30 2007 +0000 @@ -145,9 +145,9 @@ * Compatibility guest area layout: * 0x0000000000000000 - 0x00000000f57fffff [3928MB, PML4:0] * Guest-defined use. - * 0x0000000f58000000 - 0x00000000ffffffff [168MB, PML4:0] + * 0x00000000f5800000 - 0x00000000ffffffff [168MB, PML4:0] * Read-only machine-to-phys translation table (GUEST ACCESSIBLE). - * 0x0000000000000000 - 0x00000000ffffffff [508GB, PML4:0] + * 0x0000000100000000 - 0x0000007fffffffff [508GB, PML4:0] * Unused. * 0x0000008000000000 - 0x000000ffffffffff [512GB, 2^39 bytes, PML4:1] * Hypercall argument translation area. diff -r fbc233a1dc53 -r f9277e2548b5 xen/include/asm-x86/hvm/vpt.h --- a/xen/include/asm-x86/hvm/vpt.h Wed Feb 07 10:46:18 2007 -0700 +++ b/xen/include/asm-x86/hvm/vpt.h Thu Feb 08 17:27:30 2007 +0000 @@ -94,14 +94,12 @@ typedef struct RTCState { struct periodic_time pt; } RTCState; -#define FREQUENCE_PMTIMER 3579545 +#define FREQUENCE_PMTIMER 3579545 /* Timer should run at 3.579545 MHz */ typedef struct PMTState { - uint32_t pm1_timer; - uint32_t pm1_status; - uint64_t last_gtime; - struct timer timer; - uint64_t scale; - struct vcpu *vcpu; + struct hvm_hw_pmtimer pm; /* 32bit timer value */ + struct vcpu *vcpu; /* Keeps sync with this vcpu's guest-time */ + uint64_t last_gtime; /* Last (guest) time we updated the timer */ + uint64_t scale; /* Multiplier to get from tsc to timer ticks */ } PMTState; struct pl_time { /* platform time */ @@ -134,8 +132,6 @@ void rtc_deinit(struct domain *d); void rtc_deinit(struct domain *d); int is_rtc_periodic_irq(void *opaque); void pmtimer_init(struct vcpu *v, int base); -void pmtimer_migrate_timers(struct vcpu *v); -void pmtimer_deinit(struct domain *d); void hpet_migrate_timers(struct vcpu *v); void hpet_init(struct vcpu *v); diff -r fbc233a1dc53 -r f9277e2548b5 xen/include/asm-x86/kexec.h --- a/xen/include/asm-x86/kexec.h Wed Feb 07 10:46:18 2007 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -#ifndef __X86_KEXEC_H__ -#define __X86_KEXEC_H__ - -#ifdef __x86_64__ -#include <asm/x86_64/kexec.h> -#else -#include <asm/x86_32/kexec.h> -#endif - -#endif /* __X86_KEXEC_H__ */ - -/* - * Local variables: - * mode: C - * c-set-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff -r fbc233a1dc53 -r f9277e2548b5 xen/include/asm-x86/shadow.h --- a/xen/include/asm-x86/shadow.h Wed Feb 07 10:46:18 2007 -0700 +++ b/xen/include/asm-x86/shadow.h Thu Feb 08 17:27:30 2007 +0000 @@ -355,8 +355,9 @@ static inline void static inline void shadow_drop_references(struct domain *d, struct page_info *p) { - /* See the comment about locking in sh_remove_all_mappings */ - sh_remove_all_mappings(d->vcpu[0], _mfn(page_to_mfn(p))); + if ( unlikely(shadow_mode_enabled(d)) ) + /* See the comment about locking in sh_remove_all_mappings */ + sh_remove_all_mappings(d->vcpu[0], _mfn(page_to_mfn(p))); } /* Remove all shadows of the guest mfn. */ diff -r fbc233a1dc53 -r f9277e2548b5 xen/include/asm-x86/x86_32/kexec.h --- a/xen/include/asm-x86/x86_32/kexec.h Wed Feb 07 10:46:18 2007 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,39 +0,0 @@ -/****************************************************************************** - * kexec.h - * - * Based heavily on machine_kexec.c and kexec.h from Linux 2.6.19-rc1 - * - */ - -#ifndef __X86_KEXEC_X86_32_H__ -#define __X86_KEXEC_X86_32_H__ - -#include <xen/types.h> -#include <xen/kexec.h> - -typedef asmlinkage void (*relocate_new_kernel_t)( - unsigned long indirection_page, - unsigned long page_list, - unsigned long start_address, - unsigned int has_pae); - -static inline void machine_kexec(xen_kexec_image_t *image) -{ - relocate_new_kernel_t rnk; - - rnk = (relocate_new_kernel_t) image->page_list[1]; - (*rnk)(image->indirection_page, (unsigned long)image->page_list, - image->start_address, (unsigned long)cpu_has_pae); -} - -#endif /* __X86_KEXEC_X86_32_H__ */ - -/* - * Local variables: - * mode: C - * c-set-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff -r fbc233a1dc53 -r f9277e2548b5 xen/include/asm-x86/x86_64/kexec.h --- a/xen/include/asm-x86/x86_64/kexec.h Wed Feb 07 10:46:18 2007 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,38 +0,0 @@ -/****************************************************************************** - * kexec.h - * - * Based heavily on machine_kexec.c and kexec.h from Linux 2.6.19-rc1 - * - */ - -#ifndef __X86_64_KEXEC_H__ -#define __X86_64_KEXEC_H__ - -#include <xen/types.h> -#include <xen/kexec.h> - -typedef void (*relocate_new_kernel_t)( - unsigned long indirection_page, - unsigned long page_list, - unsigned long start_address); - -static inline void machine_kexec(xen_kexec_image_t *image) -{ - relocate_new_kernel_t rnk; - - rnk = (relocate_new_kernel_t) image->page_list[1]; - (*rnk)(image->indirection_page, (unsigned long)image->page_list, - image->start_address); -} - -#endif /* __X86_64_KEXEC_H__ */ - -/* - * Local variables: - * mode: C - * c-set-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff -r fbc233a1dc53 -r f9277e2548b5 xen/include/public/hvm/save.h --- a/xen/include/public/hvm/save.h Wed Feb 07 10:46:18 2007 -0700 +++ b/xen/include/public/hvm/save.h Thu Feb 08 17:27:30 2007 +0000 @@ -382,10 +382,20 @@ DECLARE_HVM_SAVE_TYPE(HPET, 12, struct h DECLARE_HVM_SAVE_TYPE(HPET, 12, struct hvm_hw_hpet); +/* + * PM timer + */ + +struct hvm_hw_pmtimer { + uint32_t timer; +}; + +DECLARE_HVM_SAVE_TYPE(PMTIMER, 13, struct hvm_hw_pmtimer); + /* * Largest type-code in use */ -#define HVM_SAVE_CODE_MAX 12 +#define HVM_SAVE_CODE_MAX 13 /* diff -r fbc233a1dc53 -r f9277e2548b5 xen/include/xen/kexec.h --- a/xen/include/xen/kexec.h Wed Feb 07 10:46:18 2007 -0700 +++ b/xen/include/xen/kexec.h Thu Feb 08 17:27:30 2007 +0000 @@ -25,6 +25,7 @@ void machine_kexec_unload(int type, int void machine_kexec_unload(int type, int slot, xen_kexec_image_t *image); void machine_kexec_reserved(xen_kexec_reserve_t *reservation); void machine_reboot_kexec(xen_kexec_image_t *image); +void machine_kexec(xen_kexec_image_t *image); void kexec_crash(void); void kexec_crash_save_cpu(void); crash_xen_info_t *kexec_crash_save_info(void); _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |