[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
# Node ID 9f09cbe84629ca378d9012d786ba2c2d5bad077c
# Parent  2fc3392d0889684c80675b29f9bde0f63cfc3cb9
# Parent  4d2ae322ef0294df2e3361179b48cb4c339a555f
Merge with xen-ia64-unstable.hg
---
 linux-2.6-xen-sparse/drivers/xen/fbfront/xenfb.c       |   28 +----
 linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c   |    4 
 linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c |    2 
 tools/Makefile                                         |    6 -
 tools/check/check_crypto_lib                           |   17 +--
 tools/check/check_openssl_devel                        |   17 +--
 tools/check/check_python                               |    5 
 tools/check/check_python_devel                         |   13 +-
 tools/check/check_python_xml                           |    8 +
 tools/check/check_udev                                 |   39 +++++--
 tools/check/check_x11_devel                            |   18 +--
 tools/ioemu/target-i386-dm/exec-dm.c                   |    2 
 tools/python/xen/xm/main.py                            |    2 
 xen/arch/x86/crash.c                                   |   19 +--
 xen/arch/x86/domain.c                                  |    4 
 xen/arch/x86/hvm/hvm.c                                 |    1 
 xen/arch/x86/hvm/i8254.c                               |   41 +++++--
 xen/arch/x86/traps.c                                   |   30 ++---
 xen/common/kexec.c                                     |   94 +++++++----------
 xen/common/page_alloc.c                                |   50 +++++----
 xen/drivers/char/console.c                             |    2 
 xen/include/asm-x86/hvm/vpt.h                          |    2 
 xen/include/xen/kexec.h                                |    8 -
 23 files changed, 238 insertions(+), 174 deletions(-)

diff -r 2fc3392d0889 -r 9f09cbe84629 
linux-2.6-xen-sparse/drivers/xen/fbfront/xenfb.c
--- a/linux-2.6-xen-sparse/drivers/xen/fbfront/xenfb.c  Thu Dec 14 09:56:41 
2006 -0700
+++ b/linux-2.6-xen-sparse/drivers/xen/fbfront/xenfb.c  Thu Dec 14 18:22:58 
2006 +0000
@@ -105,7 +105,6 @@ static int xenfb_queue_full(struct xenfb
 
 static void xenfb_update_screen(struct xenfb_info *info)
 {
-       unsigned long flags;
        int y1, y2, x1, x2;
        struct xenfb_mapping *map;
 
@@ -114,7 +113,7 @@ static void xenfb_update_screen(struct x
        if (xenfb_queue_full(info))
                return;
 
-       spin_lock_irqsave(&info->mm_lock, flags);
+       spin_lock(&info->mm_lock);
 
        y1 = info->y1;
        y2 = info->y2;
@@ -131,7 +130,7 @@ static void xenfb_update_screen(struct x
                map->faults = 0;
        }
 
-       spin_unlock_irqrestore(&info->mm_lock, flags);
+       spin_unlock(&info->mm_lock);
 
        xenfb_do_update(info, x1, y1, x2 - x1, y2 - y1);
 }
@@ -214,11 +213,9 @@ static void xenfb_refresh(struct xenfb_i
 static void xenfb_refresh(struct xenfb_info *info,
                          int x1, int y1, int w, int h)
 {
-       unsigned long flags;
-
-       spin_lock_irqsave(&info->mm_lock, flags);
+       spin_lock(&info->mm_lock);
        __xenfb_refresh(info, x1, y1, w, h);
-       spin_unlock_irqrestore(&info->mm_lock, flags);
+       spin_unlock(&info->mm_lock);
 }
 
 static void xenfb_fillrect(struct fb_info *p, const struct fb_fillrect *rect)
@@ -255,14 +252,13 @@ static void xenfb_vm_close(struct vm_are
 {
        struct xenfb_mapping *map = vma->vm_private_data;
        struct xenfb_info *info = map->info;
-       unsigned long flags;
-
-       spin_lock_irqsave(&info->mm_lock, flags);
+
+       spin_lock(&info->mm_lock);
        if (atomic_dec_and_test(&map->map_refs)) {
                list_del(&map->link);
                kfree(map);
        }
-       spin_unlock_irqrestore(&info->mm_lock, flags);
+       spin_unlock(&info->mm_lock);
 }
 
 static struct page *xenfb_vm_nopage(struct vm_area_struct *vma,
@@ -271,14 +267,13 @@ static struct page *xenfb_vm_nopage(stru
        struct xenfb_mapping *map = vma->vm_private_data;
        struct xenfb_info *info = map->info;
        int pgnr = (vaddr - vma->vm_start) >> PAGE_SHIFT;
-       unsigned long flags;
        struct page *page;
        int y1, y2;
 
        if (pgnr >= info->nr_pages)
                return NOPAGE_SIGBUS;
 
-       spin_lock_irqsave(&info->mm_lock, flags);
+       spin_lock(&info->mm_lock);
        page = info->pages[pgnr];
        get_page(page);
        map->faults++;
@@ -288,7 +283,7 @@ static struct page *xenfb_vm_nopage(stru
        if (y2 > info->fb_info->var.yres)
                y2 = info->fb_info->var.yres;
        __xenfb_refresh(info, 0, y1, info->fb_info->var.xres, y2 - y1);
-       spin_unlock_irqrestore(&info->mm_lock, flags);
+       spin_unlock(&info->mm_lock);
 
        if (type)
                *type = VM_FAULT_MINOR;
@@ -305,7 +300,6 @@ static int xenfb_mmap(struct fb_info *fb
 static int xenfb_mmap(struct fb_info *fb_info, struct vm_area_struct *vma)
 {
        struct xenfb_info *info = fb_info->par;
-       unsigned long flags;
        struct xenfb_mapping *map;
        int map_pages;
 
@@ -329,9 +323,9 @@ static int xenfb_mmap(struct fb_info *fb
        map->info = info;
        atomic_set(&map->map_refs, 1);
 
-       spin_lock_irqsave(&info->mm_lock, flags);
+       spin_lock(&info->mm_lock);
        list_add(&map->link, &info->mappings);
-       spin_unlock_irqrestore(&info->mm_lock, flags);
+       spin_unlock(&info->mm_lock);
 
        vma->vm_ops = &xenfb_vm_ops;
        vma->vm_flags |= (VM_DONTEXPAND | VM_RESERVED);
diff -r 2fc3392d0889 -r 9f09cbe84629 
linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c
--- a/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c      Thu Dec 14 
09:56:41 2006 -0700
+++ b/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c      Thu Dec 14 
18:22:58 2006 +0000
@@ -525,6 +525,8 @@ static void backend_changed(struct xenbu
                break;
 
        case XenbusStateInitWait:
+               if (dev->state != XenbusStateInitialising)
+                       break;
                if (network_connect(netdev) != 0)
                        break;
                xenbus_switch_state(dev, XenbusStateConnected);
@@ -532,6 +534,8 @@ static void backend_changed(struct xenbu
                break;
 
        case XenbusStateClosing:
+               if (dev->state == XenbusStateClosed)
+                       break;
                netfront_closing(dev);
                break;
        }
diff -r 2fc3392d0889 -r 9f09cbe84629 
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c
--- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c    Thu Dec 14 
09:56:41 2006 -0700
+++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c    Thu Dec 14 
18:22:58 2006 +0000
@@ -487,6 +487,8 @@ int xenbus_probe_node(struct xen_bus_typ
        if (!xendev)
                return -ENOMEM;
 
+       xendev->state = XenbusStateInitialising;
+
        /* Copy the strings into the extra space. */
 
        tmpstring = (char *)(xendev + 1);
diff -r 2fc3392d0889 -r 9f09cbe84629 tools/Makefile
--- a/tools/Makefile    Thu Dec 14 09:56:41 2006 -0700
+++ b/tools/Makefile    Thu Dec 14 18:22:58 2006 +0000
@@ -36,7 +36,7 @@ all: check
        $(MAKE) ioemu
 
 .PHONY: install
-install: check
+install: check_install
        @set -e; for subdir in $(SUBDIRS-y); do \
                $(MAKE) -C $$subdir $@; \
        done
@@ -58,6 +58,10 @@ check:
 check:
        $(MAKE) -C check
 
+.PHONY: check_install
+check_install: check
+       $(MAKE) -C check install
+
 .PHONY: check_clean
 check_clean:
        $(MAKE) -C check clean
diff -r 2fc3392d0889 -r 9f09cbe84629 tools/check/check_crypto_lib
--- a/tools/check/check_crypto_lib      Thu Dec 14 09:56:41 2006 -0700
+++ b/tools/check/check_crypto_lib      Thu Dec 14 18:22:58 2006 +0000
@@ -1,11 +1,14 @@
-#!/bin/bash
+#!/bin/sh
 # CHECK-BUILD CHECK-INSTALL
 
-function error {
-    echo
-    echo "  *** Check for crypto library FAILED"
-    exit 1
-}
+RC=0
 
 set -e
-ldconfig -p | grep -q libcrypto.so || error
+ldconfig -v 2>&1 | grep -q libcrypto.so || RC=1
+
+if test ${RC} -ne 0; then
+        echo
+        echo " *** Check for crypto library FAILED"
+fi
+
+exit ${RC}
diff -r 2fc3392d0889 -r 9f09cbe84629 tools/check/check_openssl_devel
--- a/tools/check/check_openssl_devel   Thu Dec 14 09:56:41 2006 -0700
+++ b/tools/check/check_openssl_devel   Thu Dec 14 18:22:58 2006 +0000
@@ -1,11 +1,14 @@
-#!/bin/bash
+#!/bin/sh
 # CHECK-BUILD
 
-function error {
-    echo
-    echo "  *** Check for openssl headers FAILED"
-    exit 1
-}
+RC=0
 
 set -e
-[ -e /usr/include/openssl/md5.h ] || error
+test -r /usr/include/openssl/md5.h || RC=1 
+
+if test ${RC} -ne 0; then
+       echo
+       echo " *** Check for openssl headers FAILED"
+fi
+
+exit ${RC}
diff -r 2fc3392d0889 -r 9f09cbe84629 tools/check/check_python
--- a/tools/check/check_python  Thu Dec 14 09:56:41 2006 -0700
+++ b/tools/check/check_python  Thu Dec 14 18:22:58 2006 +0000
@@ -3,7 +3,10 @@
 
 RC=0
 
-python -V 2>&1 | cut -d ' ' -f 2 | grep -q '^2.[2345]' || RC=1
+python -c '
+import sys
+sys.exit(sys.version_info[0] < 2 or sys.version_info[1] < 2)
+' || RC=1
 
 if test ${RC} -ne 0; then
        echo
diff -r 2fc3392d0889 -r 9f09cbe84629 tools/check/check_python_devel
--- a/tools/check/check_python_devel    Thu Dec 14 09:56:41 2006 -0700
+++ b/tools/check/check_python_devel    Thu Dec 14 18:22:58 2006 +0000
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/bin/sh
 # CHECK-BUILD
 
 function error {
@@ -7,10 +7,19 @@ function error {
     exit 1
 }
 
+RC=0
+
 python -c '
 import os.path, sys
 for p in sys.path:
        if os.path.exists(p + "/config/Makefile"):
                sys.exit(0)
 sys.exit(1)
-' || error
+' || RC=1 
+
+if test ${RC} -ne 0; then
+       echo
+       echo " *** Check for python development environment FAILED"
+fi
+
+exit ${RC}
diff -r 2fc3392d0889 -r 9f09cbe84629 tools/check/check_udev
--- a/tools/check/check_udev    Thu Dec 14 09:56:41 2006 -0700
+++ b/tools/check/check_udev    Thu Dec 14 18:22:58 2006 +0000
@@ -1,16 +1,33 @@
-#!/bin/bash
+#!/bin/sh
 # CHECK-INSTALL
 
-function error {
-   echo
-   echo '  *** Check for udev/hotplug FAILED'
-   exit 1
-}
-[ -x "$(which udevinfo)" ] && \
-  UDEV_VERSION=$(udevinfo -V | sed -e 's/^[^0-9]* 
\([0-9]\{1,\}\)[^0-9]\{0,\}/\1/')
+RC=0
 
-if [ -n "$UDEV_VERSION" ] && [ $UDEV_VERSION -ge 059 ]; then
-  exit 0
+case ${OS} in
+OpenBSD|NetBSD|FreeBSD)
+       TOOL="vnconfig"
+       which ${TOOL} 1>/dev/null 2>&1 || RC=1
+       ;;
+Linux)
+       TOOL="udevinfo"
+       test -x "$(which ${TOOL})" && \
+               UDEV_VERSION=$(${TOOL} -V | sed -e 's/^[^0-9]* 
\([0-9]\{1,\}\)[^0-9]\{0,\}/\1/')
+       if test -n "${UDEV_VERSION}" -a ${UDEV_VERSION} -ge 059; then
+               RC=0
+       else
+               TOOL="hotplug"
+               which ${TOOL} 1>/dev/null 2>&1 || RC=1
+       fi
+       ;;
+*)
+       TOOL=""
+       echo "Unknown OS" && RC=1
+       ;;
+esac
+
+if test ${RC} -ne 0; then
+       echo
+       echo ' *** Check for ${TOOL} FAILED'
 fi
 
-which hotplug 1>/dev/null 2>&1 || error
+exit ${RC}
diff -r 2fc3392d0889 -r 9f09cbe84629 tools/check/check_x11_devel
--- a/tools/check/check_x11_devel       Thu Dec 14 09:56:41 2006 -0700
+++ b/tools/check/check_x11_devel       Thu Dec 14 18:22:58 2006 +0000
@@ -1,11 +1,15 @@
-#!/bin/bash
+#!/bin/sh
 # CHECK-BUILD
 
-function error {
-    echo
-    echo "  *** Check for x11 headers FAILED"
-    exit 1
-}
+RC=0
 
 set -e
-[ -e /usr/include/X11/keysymdef.h ] || error
+test -r /usr/include/X11/keysymdef.h || \
+test -r /usr/X11R6/include/X11/keysymdef.h || RC=1
+
+if test ${RC} -ne 0; then
+       echo
+       echo " *** Check for x11 headers FAILED"
+fi
+
+exit ${RC}
diff -r 2fc3392d0889 -r 9f09cbe84629 tools/ioemu/target-i386-dm/exec-dm.c
--- a/tools/ioemu/target-i386-dm/exec-dm.c      Thu Dec 14 09:56:41 2006 -0700
+++ b/tools/ioemu/target-i386-dm/exec-dm.c      Thu Dec 14 18:22:58 2006 +0000
@@ -441,7 +441,7 @@ void cpu_physical_memory_rw(target_phys_
     uint32_t val;
 
 #if defined(__i386__) || defined(__x86_64__)
-    static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+    static pthread_mutex_t mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
     pthread_mutex_lock(&mutex);
 #endif
 
diff -r 2fc3392d0889 -r 9f09cbe84629 tools/python/xen/xm/main.py
--- a/tools/python/xen/xm/main.py       Thu Dec 14 09:56:41 2006 -0700
+++ b/tools/python/xen/xm/main.py       Thu Dec 14 18:22:58 2006 +0000
@@ -709,7 +709,7 @@ def xm_vcpu_list(args):
         dominfo = map(server.xend.domain.getVCPUInfo, doms)
 
     print '%-32s %3s %5s %5s %5s %9s %s' % \
-          ('Name', 'ID', 'VCPUs', 'CPU', 'State', 'Time(s)', 'CPU Affinity')
+          ('Name', 'ID', 'VCPU', 'CPU', 'State', 'Time(s)', 'CPU Affinity')
 
     format = '%(name)-32s %(domid)3d %(number)5d %(c)5s %(s)5s ' \
              ' %(cpu_time)8.1f %(cpumap)s'
diff -r 2fc3392d0889 -r 9f09cbe84629 xen/arch/x86/crash.c
--- a/xen/arch/x86/crash.c      Thu Dec 14 09:56:41 2006 -0700
+++ b/xen/arch/x86/crash.c      Thu Dec 14 18:22:58 2006 +0000
@@ -28,6 +28,7 @@
 #include <asm/hvm/hvm.h>
 
 static atomic_t waiting_for_crash_ipi;
+static unsigned int crashing_cpu;
 
 static int crash_nmi_callback(struct cpu_user_regs *regs, int cpu)
 {
@@ -39,7 +40,7 @@ static int crash_nmi_callback(struct cpu
         return 1;
     local_irq_disable();
 
-    machine_crash_save_cpu();
+    kexec_crash_save_cpu();
     disable_local_APIC();
     atomic_dec(&waiting_for_crash_ipi);
     hvm_disable();
@@ -67,6 +68,8 @@ static void nmi_shootdown_cpus(void)
 {
     unsigned long msecs;
 
+    crashing_cpu = smp_processor_id();
+
     atomic_set(&waiting_for_crash_ipi, num_online_cpus() - 1);
     /* Would it be better to replace the trap vector here? */
     set_nmi_callback(crash_nmi_callback);
@@ -86,18 +89,10 @@ static void nmi_shootdown_cpus(void)
     disable_local_APIC();
 }
 
-static void crash_save_xen_notes(void)
+void machine_crash_shutdown(void)
 {
     crash_xen_info_t *info;
 
-    info = machine_crash_save_info();
-
-    info->dom0_pfn_to_mfn_frame_list_list = \
-        dom0->shared_info->arch.pfn_to_mfn_frame_list_list;
-}
-
-void machine_crash_shutdown(void)
-{
     local_irq_disable();
 
     nmi_shootdown_cpus();
@@ -106,7 +101,9 @@ void machine_crash_shutdown(void)
 
     hvm_disable();
 
-    crash_save_xen_notes();
+    info = kexec_crash_save_info();
+    info->dom0_pfn_to_mfn_frame_list_list =
+        dom0->shared_info->arch.pfn_to_mfn_frame_list_list;
 }
 
 /*
diff -r 2fc3392d0889 -r 9f09cbe84629 xen/arch/x86/domain.c
--- a/xen/arch/x86/domain.c     Thu Dec 14 09:56:41 2006 -0700
+++ b/xen/arch/x86/domain.c     Thu Dec 14 18:22:58 2006 +0000
@@ -136,6 +136,10 @@ int vcpu_initialise(struct vcpu *v)
 
     pae_l3_cache_init(&v->arch.pae_l3_cache);
 
+    /* This should move to arch_domain_create(). */
+    if ( !is_idle_domain(d) && (v->vcpu_id == 0) )
+        pit_init(v, cpu_khz);
+
     if ( is_hvm_domain(d) )
     {
         if ( (rc = hvm_vcpu_initialise(v)) != 0 )
diff -r 2fc3392d0889 -r 9f09cbe84629 xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c    Thu Dec 14 09:56:41 2006 -0700
+++ b/xen/arch/x86/hvm/hvm.c    Thu Dec 14 18:22:58 2006 +0000
@@ -222,7 +222,6 @@ int hvm_vcpu_initialise(struct vcpu *v)
 
     init_timer(&platform->pl_time.periodic_tm.timer,
                pt_timer_fn, v, v->processor);
-    pit_init(v, cpu_khz);
     rtc_init(v, RTC_PORT(0), RTC_IRQ);
     pmtimer_init(v, ACPI_PM_TMR_BLK_ADDRESS);
 
diff -r 2fc3392d0889 -r 9f09cbe84629 xen/arch/x86/hvm/i8254.c
--- a/xen/arch/x86/hvm/i8254.c  Thu Dec 14 09:56:41 2006 -0700
+++ b/xen/arch/x86/hvm/i8254.c  Thu Dec 14 18:22:58 2006 +0000
@@ -184,12 +184,18 @@ void pit_time_fired(struct vcpu *v, void
 
 static inline void pit_load_count(PITChannelState *s, int val)
 {
-    u32   period;
+    u32 period;
+    PITChannelState *ch0 =
+        &current->domain->arch.hvm_domain.pl_time.vpit.channels[0];
+
     if (val == 0)
         val = 0x10000;
     s->count_load_time = hvm_get_clock(s->vcpu);
     s->count = val;
     period = DIV_ROUND((val * 1000000000ULL), PIT_FREQ);
+
+    if (s != ch0)
+        return;
 
 #ifdef DEBUG_PIT
     printk("HVM_PIT: pit-load-counter(%p), count=0x%x, period=%uns mode=%d, 
load_time=%lld\n",
@@ -419,13 +425,12 @@ static void speaker_ioport_write(void *o
 
 static uint32_t speaker_ioport_read(void *opaque, uint32_t addr)
 {
-    int out;
-    PITState *pit = opaque;
-    out = pit_get_out(pit, 2, hvm_get_clock(pit->channels[2].vcpu));
-    pit->dummy_refresh_clock ^= 1;
-
-    return (pit->speaker_data_on << 1) | pit_get_gate(pit, 2) | (out << 5) |
-      (pit->dummy_refresh_clock << 4);
+    PITState *pit = opaque;
+    int out = pit_get_out(pit, 2, hvm_get_clock(pit->channels[2].vcpu));
+    /* Refresh clock toggles at about 15us. We approximate as 2^14ns. */
+    unsigned int refresh_clock = ((unsigned int)NOW() >> 14) & 1;
+    return ((pit->speaker_data_on << 1) | pit_get_gate(pit, 2) |
+            (out << 5) | refresh_clock << 4);
 }
 
 static int handle_speaker_io(ioreq_t *p)
@@ -439,7 +444,7 @@ static int handle_speaker_io(ioreq_t *p)
         printk("HVM_SPEAKER:wrong SPEAKER IO!\n");
         return 1;
     }
-    
+
     if (p->dir == 0) {/* write */
         speaker_ioport_write(vpit, p->addr, p->data);
     } else if (p->dir == 1) {/* read */
@@ -448,3 +453,21 @@ static int handle_speaker_io(ioreq_t *p)
 
     return 1;
 }
+
+int pv_pit_handler(int port, int data, int write)
+{
+    ioreq_t ioreq = {
+        .size = 1,
+        .type = IOREQ_TYPE_PIO,
+        .addr = port,
+        .dir  = write ? 0 : 1,
+        .data = write ? data : 0,
+    };
+
+    if (port == 0x61)
+        handle_speaker_io(&ioreq);
+    else
+        handle_pit_io(&ioreq);
+
+    return !write ? ioreq.data : 0;
+}
diff -r 2fc3392d0889 -r 9f09cbe84629 xen/arch/x86/traps.c
--- a/xen/arch/x86/traps.c      Thu Dec 14 09:56:41 2006 -0700
+++ b/xen/arch/x86/traps.c      Thu Dec 14 18:22:58 2006 +0000
@@ -59,6 +59,7 @@
 #include <asm/debugger.h>
 #include <asm/msr.h>
 #include <asm/x86_emulate.h>
+#include <asm/hvm/vpt.h>
 
 /*
  * opt_nmi: one of 'ignore', 'dom0', or 'fatal'.
@@ -1035,18 +1036,7 @@ static inline int admin_io_okay(
     return ioports_access_permitted(v->domain, port, port + bytes - 1);
 }
 
-static inline int guest_inb_okay(
-    unsigned int port, struct vcpu *v, struct cpu_user_regs *regs)
-{
-    /*
-     * Allow read access to port 0x61. Bit 4 oscillates with period 30us, and
-     * so it is often used for timing loops in BIOS code. This hack can go
-     * away when we have separate read/write permission rangesets.
-     * Note that we could emulate bit 4 instead of directly reading port 0x61,
-     * but there's not really a good reason to do so.
-     */
-    return (admin_io_okay(port, 1, v, regs) || (port == 0x61));
-}
+#define guest_inb_okay(_p, _d, _r) admin_io_okay(_p, 1, _d, _r)
 #define guest_inw_okay(_p, _d, _r) admin_io_okay(_p, 2, _d, _r)
 #define guest_inl_okay(_p, _d, _r) admin_io_okay(_p, 4, _d, _r)
 #define guest_outb_okay(_p, _d, _r) admin_io_okay(_p, 1, _d, _r)
@@ -1141,7 +1131,10 @@ static int emulate_privileged_op(struct 
             switch ( op_bytes )
             {
             case 1:
-                data = (u8)(guest_inb_okay(port, v, regs) ? inb(port) : ~0);
+                /* emulate PIT counter 2 */
+                data = (u8)(guest_inb_okay(port, v, regs) ? inb(port) : 
+                       ((port == 0x42 || port == 0x43 || port == 0x61) ?
+                       pv_pit_handler(port, 0, 0) : ~0)); 
                 break;
             case 2:
                 data = (u16)(guest_inw_okay(port, v, regs) ? inw(port) : ~0);
@@ -1176,6 +1169,8 @@ static int emulate_privileged_op(struct 
             case 1:
                 if ( guest_outb_okay(port, v, regs) )
                     outb((u8)data, port);
+                else if ( port == 0x42 || port == 0x43 || port == 0x61 )
+                    pv_pit_handler(port, data, 1);
                 break;
             case 2:
                 if ( guest_outw_okay(port, v, regs) )
@@ -1240,6 +1235,11 @@ static int emulate_privileged_op(struct 
         case 1:
             if ( guest_inb_okay(port, v, regs) )
                 io_emul(regs);
+            else if ( port == 0x42 || port == 0x43 || port == 0x61 )
+            {
+                regs->eax &= ~0xffUL;
+                regs->eax |= pv_pit_handler(port, 0, 0);
+            } 
             else
                 regs->eax |= (u8)~0;
             break;
@@ -1277,6 +1277,8 @@ static int emulate_privileged_op(struct 
         case 1:
             if ( guest_outb_okay(port, v, regs) )
                 io_emul(regs);
+            else if ( port == 0x42 || port == 0x43 || port == 0x61 )
+                pv_pit_handler(port, regs->eax, 1);
             break;
         case 2:
             if ( guest_outw_okay(port, v, regs) )
@@ -1665,7 +1667,7 @@ static void unknown_nmi_error(unsigned c
         printk("Uhhuh. NMI received for unknown reason %02x.\n", reason);
         printk("Dazed and confused, but trying to continue\n");
         printk("Do you have a strange power saving mode enabled?\n");
-        machine_crash_kexec();
+        kexec_crash();
     }
 }
 
diff -r 2fc3392d0889 -r 9f09cbe84629 xen/common/kexec.c
--- a/xen/common/kexec.c        Thu Dec 14 09:56:41 2006 -0700
+++ b/xen/common/kexec.c        Thu Dec 14 18:22:58 2006 +0000
@@ -24,7 +24,6 @@
 
 DEFINE_PER_CPU (crash_note_t, crash_notes);
 cpumask_t crash_saved_cpus;
-int crashing_cpu;
 
 xen_kexec_image_t kexec_image[KEXEC_IMAGE_NR];
 
@@ -58,38 +57,34 @@ custom_param("crashkernel", parse_crashk
 
 static void one_cpu_only(void)
 {
-   /* Only allow the first cpu to continue - force other cpus to spin */
+    /* Only allow the first cpu to continue - force other cpus to spin */
     if ( test_and_set_bit(KEXEC_FLAG_IN_PROGRESS, &kexec_flags) )
-    {
-        while (1);
-    }
-}
-
-/* Save the registers in the per-cpu crash note buffer */
-
-void machine_crash_save_cpu(void)
+        for ( ; ; ) ;
+}
+
+/* Save the registers in the per-cpu crash note buffer. */
+void kexec_crash_save_cpu(void)
 {
     int cpu = smp_processor_id();
     crash_note_t *cntp;
 
-    if ( !cpu_test_and_set(cpu, crash_saved_cpus) )
-    {
-        cntp = &per_cpu(crash_notes, cpu);
-        elf_core_save_regs(&cntp->core.desc.desc.pr_reg,
-                           &cntp->xen_regs.desc.desc);
-
-        /* setup crash "CORE" note */
-        setup_crash_note(cntp, core, CORE_STR, CORE_STR_LEN, NT_PRSTATUS);
-
-        /* setup crash note "Xen", XEN_ELFNOTE_CRASH_REGS */
-        setup_crash_note(cntp, xen_regs, XEN_STR, XEN_STR_LEN,
-                         XEN_ELFNOTE_CRASH_REGS);
-    }
-}
-
-/* Setup the single Xen specific info crash note */
-
-crash_xen_info_t *machine_crash_save_info(void)
+    if ( cpu_test_and_set(cpu, crash_saved_cpus) )
+        return;
+
+    cntp = &per_cpu(crash_notes, cpu);
+    elf_core_save_regs(&cntp->core.desc.desc.pr_reg,
+                       &cntp->xen_regs.desc.desc);
+
+    /* Set up crash "CORE" note. */
+    setup_crash_note(cntp, core, CORE_STR, CORE_STR_LEN, NT_PRSTATUS);
+
+    /* Set up crash note "Xen", XEN_ELFNOTE_CRASH_REGS. */
+    setup_crash_note(cntp, xen_regs, XEN_STR, XEN_STR_LEN,
+                     XEN_ELFNOTE_CRASH_REGS);
+}
+
+/* Set up the single Xen-specific-info crash note. */
+crash_xen_info_t *kexec_crash_save_info(void)
 {
     int cpu = smp_processor_id();
     crash_note_t *cntp;
@@ -99,7 +94,7 @@ crash_xen_info_t *machine_crash_save_inf
 
     cntp = &per_cpu(crash_notes, cpu);
 
-    /* setup crash note "Xen", XEN_ELFNOTE_CRASH_INFO */
+    /* Set up crash note "Xen", XEN_ELFNOTE_CRASH_INFO. */
     setup_crash_note(cntp, xen_info, XEN_STR, XEN_STR_LEN,
                      XEN_ELFNOTE_CRASH_INFO);
 
@@ -117,45 +112,34 @@ crash_xen_info_t *machine_crash_save_inf
     return info;
 }
 
-void machine_crash_kexec(void)
+void kexec_crash(void)
 {
     int pos;
-    xen_kexec_image_t *image;
+
+    pos = (test_bit(KEXEC_FLAG_CRASH_POS, &kexec_flags) != 0);
+    if ( !test_bit(KEXEC_IMAGE_CRASH_BASE + pos, &kexec_flags) )
+        return;
 
     one_cpu_only();
-
-    machine_crash_save_cpu();
-    crashing_cpu = smp_processor_id();
-
+    kexec_crash_save_cpu();
     machine_crash_shutdown();
 
-    pos = (test_bit(KEXEC_FLAG_CRASH_POS, &kexec_flags) != 0);
-
-    if ( test_bit(KEXEC_IMAGE_CRASH_BASE + pos, &kexec_flags) )
-    {
-        image = &kexec_image[KEXEC_IMAGE_CRASH_BASE + pos];
-        machine_kexec(image); /* Does not return */
-    }
+    machine_kexec(&kexec_image[KEXEC_IMAGE_CRASH_BASE + pos]);
+
+    BUG();
 }
 
 static void do_crashdump_trigger(unsigned char key)
 {
-    int pos = (test_bit(KEXEC_FLAG_CRASH_POS, &kexec_flags) != 0);
-    if ( test_bit(KEXEC_IMAGE_CRASH_BASE + pos, &kexec_flags) )
-    {
-        printk("'%c' pressed -> triggering crashdump\n", key);
-        machine_crash_kexec();
-    }
-    else
-    {
-        printk("'%c' pressed -> no crash kernel loaded -- not triggering 
crashdump\n", key);
-    }
+    printk("'%c' pressed -> triggering crashdump\n", key);
+    kexec_crash();
+    printk(" * no crash kernel loaded!\n");
 }
 
 static __init int register_crashdump_trigger(void)
 {
-       register_keyhandler('C', do_crashdump_trigger, "trigger a crashdump");
-       return 0;
+    register_keyhandler('C', do_crashdump_trigger, "trigger a crashdump");
+    return 0;
 }
 __initcall(register_crashdump_trigger);
 
@@ -303,7 +287,7 @@ static int kexec_exec(XEN_GUEST_HANDLE(v
         machine_reboot_kexec(image); /* Does not return */
         break;
     case KEXEC_TYPE_CRASH:
-        machine_crash_kexec(); /* Does not return */
+        kexec_crash(); /* Does not return */
         break;
     }
 
diff -r 2fc3392d0889 -r 9f09cbe84629 xen/common/page_alloc.c
--- a/xen/common/page_alloc.c   Thu Dec 14 09:56:41 2006 -0700
+++ b/xen/common/page_alloc.c   Thu Dec 14 18:22:58 2006 +0000
@@ -136,7 +136,6 @@ static void map_alloc(unsigned long firs
     }
 }
 
-
 static void map_free(unsigned long first_page, unsigned long nr_pages)
 {
     unsigned long start_off, end_off, curr_idx, end_idx;
@@ -170,6 +169,8 @@ static void map_free(unsigned long first
 /*************************
  * BOOT-TIME ALLOCATOR
  */
+
+static unsigned long first_valid_mfn = ~0UL;
 
 /* Initialise allocator to handle up to @max_page pages. */
 paddr_t init_boot_allocator(paddr_t bitmap_start)
@@ -203,6 +204,8 @@ void init_boot_pages(paddr_t ps, paddr_t
     if ( pe <= ps )
         return;
 
+    first_valid_mfn = min_t(unsigned long, ps >> PAGE_SHIFT, first_valid_mfn);
+
     map_free(ps >> PAGE_SHIFT, (pe - ps) >> PAGE_SHIFT);
 
     /* Check new pages against the bad-page list. */
@@ -256,16 +259,17 @@ unsigned long alloc_boot_pages_at(unsign
 
 unsigned long alloc_boot_pages(unsigned long nr_pfns, unsigned long pfn_align)
 {
-    unsigned long pg, i = 0;
-
-    for ( pg = 0; (pg + nr_pfns) < max_page; pg += pfn_align )
-    {
-        i = alloc_boot_pages_at(nr_pfns, pg);
-        if (i != 0)
+    unsigned long pg;
+
+    pg = first_valid_mfn & ~(pfn_align-1);
+    while ( (pg + nr_pfns) < max_page )
+    {
+        if ( alloc_boot_pages_at(nr_pfns, pg) != 0 )
             break;
-    }
-
-    return i;
+        pg += pfn_align;
+    }
+
+    return pg;
 }
 
 
@@ -291,7 +295,7 @@ void end_boot_allocator(void)
 void end_boot_allocator(void)
 {
     unsigned long i, j, k;
-    int curr_free = 0, next_free = 0;
+    int curr_free, next_free;
 
     memset(avail, 0, sizeof(avail));
 
@@ -301,7 +305,9 @@ void end_boot_allocator(void)
                 INIT_LIST_HEAD(&heap[i][j][k]);
 
     /* Pages that are free now go to the domain sub-allocator. */
-    for ( i = 0; i < max_page; i++ )
+    if ( (curr_free = next_free = !allocated_in_map(first_valid_mfn)) )
+        map_alloc(first_valid_mfn, 1);
+    for ( i = first_valid_mfn; i < max_page; i++ )
     {
         curr_free = next_free;
         next_free = !allocated_in_map(i+1);
@@ -324,7 +330,7 @@ void init_heap_pages(
 void init_heap_pages(
     unsigned int zone, struct page_info *pg, unsigned long nr_pages)
 {
-    unsigned int nid_curr,nid_prev;
+    unsigned int nid_curr, nid_prev;
     unsigned long i;
 
     ASSERT(zone < NR_ZONES);
@@ -478,37 +484,37 @@ void scrub_heap_pages(void)
 void scrub_heap_pages(void)
 {
     void *p;
-    unsigned long pfn;
+    unsigned long mfn;
 
     printk("Scrubbing Free RAM: ");
 
-    for ( pfn = 0; pfn < max_page; pfn++ )
+    for ( mfn = first_valid_mfn; mfn < max_page; mfn++ )
     {
         /* Every 100MB, print a progress dot. */
-        if ( (pfn % ((100*1024*1024)/PAGE_SIZE)) == 0 )
+        if ( (mfn % ((100*1024*1024)/PAGE_SIZE)) == 0 )
             printk(".");
 
         process_pending_timers();
 
         /* Quick lock-free check. */
-        if ( allocated_in_map(pfn) )
+        if ( allocated_in_map(mfn) )
             continue;
 
         spin_lock_irq(&heap_lock);
 
         /* Re-check page status with lock held. */
-        if ( !allocated_in_map(pfn) )
-        {
-            if ( IS_XEN_HEAP_FRAME(mfn_to_page(pfn)) )
+        if ( !allocated_in_map(mfn) )
+        {
+            if ( IS_XEN_HEAP_FRAME(mfn_to_page(mfn)) )
             {
-                p = page_to_virt(mfn_to_page(pfn));
+                p = page_to_virt(mfn_to_page(mfn));
                 memguard_unguard_range(p, PAGE_SIZE);
                 clear_page(p);
                 memguard_guard_range(p, PAGE_SIZE);
             }
             else
             {
-                p = map_domain_page(pfn);
+                p = map_domain_page(mfn);
                 clear_page(p);
                 unmap_domain_page(p);
             }
diff -r 2fc3392d0889 -r 9f09cbe84629 xen/drivers/char/console.c
--- a/xen/drivers/char/console.c        Thu Dec 14 09:56:41 2006 -0700
+++ b/xen/drivers/char/console.c        Thu Dec 14 18:22:58 2006 +0000
@@ -866,7 +866,7 @@ void panic(const char *fmt, ...)
 
     debugger_trap_immediate();
 
-    machine_crash_kexec();
+    kexec_crash();
 
     if ( opt_noreboot )
     {
diff -r 2fc3392d0889 -r 9f09cbe84629 xen/include/asm-x86/hvm/vpt.h
--- a/xen/include/asm-x86/hvm/vpt.h     Thu Dec 14 09:56:41 2006 -0700
+++ b/xen/include/asm-x86/hvm/vpt.h     Thu Dec 14 18:22:58 2006 +0000
@@ -54,7 +54,6 @@ typedef struct PITState {
 typedef struct PITState {
     PITChannelState channels[3];
     int speaker_data_on;
-    int dummy_refresh_clock;
 } PITState;
 
 #define RTC_SIZE 14
@@ -125,6 +124,7 @@ extern struct periodic_time *create_peri
 extern struct periodic_time *create_periodic_time(
     u32 period, char irq, char one_shot, time_cb *cb, void *data);
 extern void destroy_periodic_time(struct periodic_time *pt);
+int pv_pit_handler(int port, int data, int write);
 void pit_init(struct vcpu *v, unsigned long cpu_khz);
 void rtc_init(struct vcpu *v, int base, int irq);
 void rtc_deinit(struct domain *d);
diff -r 2fc3392d0889 -r 9f09cbe84629 xen/include/xen/kexec.h
--- a/xen/include/xen/kexec.h   Thu Dec 14 09:56:41 2006 -0700
+++ b/xen/include/xen/kexec.h   Thu Dec 14 18:22:58 2006 +0000
@@ -4,8 +4,6 @@
 #include <public/kexec.h>
 #include <asm/percpu.h>
 #include <xen/elfcore.h>
-
-extern int crashing_cpu;
 
 typedef struct xen_kexec_reserve {
     unsigned long size;
@@ -27,9 +25,9 @@ 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_crash_kexec(void);
-void machine_crash_save_cpu(void);
-crash_xen_info_t *machine_crash_save_info(void);
+void kexec_crash(void);
+void kexec_crash_save_cpu(void);
+crash_xen_info_t *kexec_crash_save_info(void);
 void machine_crash_shutdown(void);
 
 #endif /* __XEN_KEXEC_H__ */
diff -r 2fc3392d0889 -r 9f09cbe84629 tools/check/check_python_xml
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/check/check_python_xml      Thu Dec 14 18:22:58 2006 +0000
@@ -0,0 +1,8 @@
+#!/bin/sh
+# CHECK-INSTALL
+
+python -c 'import xml.dom.minidom' 2>/dev/null || {
+    echo
+    echo "  *** Check for python-xml package FAILED"
+    exit 1
+}

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.