# HG changeset patch
# User awilliam@xxxxxxxxxxx
# Node ID a9f5cf43451f228140f221ce8c92c290bf0ab247
# Parent f163677f87672d000ea77179690663663ab42a1a
# Parent 5e5e56b5e7516c0569b766a52079595e4ff1b955
merge
diff -r f163677f8767 -r a9f5cf43451f .hgignore
--- a/.hgignore Tue Mar 21 16:55:44 2006
+++ b/.hgignore Tue Mar 21 18:19:11 2006
@@ -13,6 +13,7 @@
.*\.flc$
.*\.orig$
.*\.rej$
+.*/a\.out$
^[^/]*\.bz2$
^TAGS$
^dist/.*$
diff -r f163677f8767 -r a9f5cf43451f buildconfigs/Rules.mk
--- a/buildconfigs/Rules.mk Tue Mar 21 16:55:44 2006
+++ b/buildconfigs/Rules.mk Tue Mar 21 18:19:11 2006
@@ -70,7 +70,7 @@
rm -rf tmp-pristine-$* $(@D)
mkdir -p tmp-pristine-$*
tar -C tmp-pristine-$* -jxf $<
- -@rm tmp-pristine-$*/pax_global_header
+ -@rm -f tmp-pristine-$*/pax_global_header
mv tmp-pristine-$*/* $(@D)
@rm -rf tmp-pristine-$*
touch $(@D)/.hgskip
diff -r f163677f8767 -r a9f5cf43451f buildconfigs/linux-defconfig_xen0_x86_32
--- a/buildconfigs/linux-defconfig_xen0_x86_32 Tue Mar 21 16:55:44 2006
+++ b/buildconfigs/linux-defconfig_xen0_x86_32 Tue Mar 21 18:19:11 2006
@@ -1328,6 +1328,7 @@
# CONFIG_XEN_TPMDEV_FRONTEND is not set
CONFIG_XEN_SCRUB_PAGES=y
CONFIG_XEN_DISABLE_SERIAL=y
+CONFIG_XEN_SYSFS=y
CONFIG_HAVE_ARCH_ALLOC_SKB=y
CONFIG_HAVE_ARCH_DEV_ALLOC_SKB=y
diff -r f163677f8767 -r a9f5cf43451f buildconfigs/linux-defconfig_xen0_x86_64
--- a/buildconfigs/linux-defconfig_xen0_x86_64 Tue Mar 21 16:55:44 2006
+++ b/buildconfigs/linux-defconfig_xen0_x86_64 Tue Mar 21 18:19:11 2006
@@ -1253,6 +1253,7 @@
# CONFIG_XEN_TPMDEV_FRONTEND is not set
CONFIG_XEN_SCRUB_PAGES=y
CONFIG_XEN_DISABLE_SERIAL=y
+CONFIG_XEN_SYSFS=y
CONFIG_HAVE_ARCH_ALLOC_SKB=y
CONFIG_HAVE_ARCH_DEV_ALLOC_SKB=y
diff -r f163677f8767 -r a9f5cf43451f buildconfigs/linux-defconfig_xenU_x86_32
--- a/buildconfigs/linux-defconfig_xenU_x86_32 Tue Mar 21 16:55:44 2006
+++ b/buildconfigs/linux-defconfig_xenU_x86_32 Tue Mar 21 18:19:11 2006
@@ -868,6 +868,7 @@
# CONFIG_XEN_TPMDEV_FRONTEND is not set
CONFIG_XEN_SCRUB_PAGES=y
CONFIG_XEN_DISABLE_SERIAL=y
+CONFIG_XEN_SYSFS=y
CONFIG_HAVE_ARCH_ALLOC_SKB=y
CONFIG_HAVE_ARCH_DEV_ALLOC_SKB=y
diff -r f163677f8767 -r a9f5cf43451f buildconfigs/linux-defconfig_xenU_x86_64
--- a/buildconfigs/linux-defconfig_xenU_x86_64 Tue Mar 21 16:55:44 2006
+++ b/buildconfigs/linux-defconfig_xenU_x86_64 Tue Mar 21 18:19:11 2006
@@ -1144,6 +1144,7 @@
# CONFIG_XEN_TPMDEV_FRONTEND is not set
CONFIG_XEN_SCRUB_PAGES=y
CONFIG_XEN_DISABLE_SERIAL=y
+CONFIG_XEN_SYSFS=y
CONFIG_HAVE_ARCH_ALLOC_SKB=y
CONFIG_HAVE_ARCH_DEV_ALLOC_SKB=y
diff -r f163677f8767 -r a9f5cf43451f buildconfigs/linux-defconfig_xen_x86_32
--- a/buildconfigs/linux-defconfig_xen_x86_32 Tue Mar 21 16:55:44 2006
+++ b/buildconfigs/linux-defconfig_xen_x86_32 Tue Mar 21 18:19:11 2006
@@ -2994,6 +2994,7 @@
# CONFIG_XEN_TPMDEV_FRONTEND is not set
CONFIG_XEN_SCRUB_PAGES=y
CONFIG_XEN_DISABLE_SERIAL=y
+CONFIG_XEN_SYSFS=m
CONFIG_HAVE_ARCH_ALLOC_SKB=y
CONFIG_HAVE_ARCH_DEV_ALLOC_SKB=y
diff -r f163677f8767 -r a9f5cf43451f buildconfigs/linux-defconfig_xen_x86_64
--- a/buildconfigs/linux-defconfig_xen_x86_64 Tue Mar 21 16:55:44 2006
+++ b/buildconfigs/linux-defconfig_xen_x86_64 Tue Mar 21 18:19:11 2006
@@ -2665,6 +2665,7 @@
# CONFIG_XEN_TPMDEV_FRONTEND is not set
CONFIG_XEN_SCRUB_PAGES=y
CONFIG_XEN_DISABLE_SERIAL=y
+CONFIG_XEN_SYSFS=m
CONFIG_HAVE_ARCH_ALLOC_SKB=y
CONFIG_HAVE_ARCH_DEV_ALLOC_SKB=y
diff -r f163677f8767 -r a9f5cf43451f buildconfigs/mk.linux-2.6-xen
--- a/buildconfigs/mk.linux-2.6-xen Tue Mar 21 16:55:44 2006
+++ b/buildconfigs/mk.linux-2.6-xen Tue Mar 21 18:19:11 2006
@@ -2,9 +2,8 @@
OS = linux
LINUX_SERIES = 2.6
-LINUX_VER = 2.6.16-rc5
-LINUX_SRCS = linux-2.6.15.tar.bz2 patch-2.6.16-rc5.bz2
-LINUX_PDIR = linux-$(LINUX_VER)
+LINUX_VER = 2.6.16
+LINUX_SRCS = linux-2.6.16.tar.bz2
EXTRAVERSION ?= xen
@@ -22,20 +21,6 @@
fi
$(MAKE) -C $(LINUX_DIR) ARCH=$(LINUX_ARCH) INSTALL_PATH=$(DESTDIR)
vmlinuz
$(MAKE) -C $(LINUX_DIR) ARCH=$(LINUX_ARCH) INSTALL_PATH=$(DESTDIR)
install
-
-pristine-$(LINUX_PDIR)/.valid-srcs: $(LINUX_SRCS)
- rm -rf tmp-pristine-$(LINUX_PDIR) $(@D)
- mkdir -p tmp-pristine-$(LINUX_PDIR)
- tar -C tmp-pristine-$(LINUX_PDIR) -jxf $<
- -@rm tmp-pristine-$(LINUX_PDIR)/pax_global_header
- mv tmp-pristine-$(LINUX_PDIR)/* $(@D)
- @rm -rf tmp-pristine-$(LINUX_PDIR)
- bzcat $(wordlist 2,$(words $^),$^) | patch -d $(@D) -p1
- touch $(@D)/.hgskip
- touch $@
-
-pristine-linux-%.16-rc5/.valid-pristine: pristine-$(LINUX_PDIR)/.valid-srcs
- touch $@ # update timestamp to avoid rebuild
$(LINUX_DIR)/include/linux/autoconf.h: ref-$(OS)-$(LINUX_VER)/.valid-ref
rm -rf $(LINUX_DIR)
diff -r f163677f8767 -r a9f5cf43451f
linux-2.6-xen-sparse/arch/i386/kernel/Makefile
--- a/linux-2.6-xen-sparse/arch/i386/kernel/Makefile Tue Mar 21 16:55:44 2006
+++ b/linux-2.6-xen-sparse/arch/i386/kernel/Makefile Tue Mar 21 18:19:11 2006
@@ -11,7 +11,7 @@
obj-y += cpu/
obj-y += timers/
-obj-$(CONFIG_ACPI) += acpi/
+obj-y += acpi/
obj-$(CONFIG_X86_BIOS_REBOOT) += reboot.o
obj-$(CONFIG_MCA) += mca.o
obj-$(CONFIG_X86_MSR) += msr.o
diff -r f163677f8767 -r a9f5cf43451f
linux-2.6-xen-sparse/arch/i386/kernel/acpi/Makefile
--- a/linux-2.6-xen-sparse/arch/i386/kernel/acpi/Makefile Tue Mar 21
16:55:44 2006
+++ b/linux-2.6-xen-sparse/arch/i386/kernel/acpi/Makefile Tue Mar 21
18:19:11 2006
@@ -1,4 +1,4 @@
-obj-y := boot.o
+obj-$(CONFIG_ACPI) += boot.o
obj-$(CONFIG_X86_IO_APIC) += earlyquirk.o
obj-$(CONFIG_ACPI_SLEEP) += sleep.o wakeup.o
diff -r f163677f8767 -r a9f5cf43451f
linux-2.6-xen-sparse/arch/i386/kernel/acpi/boot-xen.c
--- a/linux-2.6-xen-sparse/arch/i386/kernel/acpi/boot-xen.c Tue Mar 21
16:55:44 2006
+++ b/linux-2.6-xen-sparse/arch/i386/kernel/acpi/boot-xen.c Tue Mar 21
18:19:11 2006
@@ -44,6 +44,9 @@
extern int gsi_irq_sharing(int gsi);
#include <asm/proto.h>
+static inline int acpi_madt_oem_check(char *oem_id, char *oem_table_id) {
return 0; }
+
+
#else /* X86 */
#ifdef CONFIG_X86_LOCAL_APIC
@@ -1111,9 +1114,6 @@
disable_acpi();
return error;
}
-#ifdef __i386__
- check_acpi_pci();
-#endif
acpi_table_parse(ACPI_BOOT, acpi_parse_sbf);
diff -r f163677f8767 -r a9f5cf43451f
linux-2.6-xen-sparse/arch/i386/kernel/cpu/common-xen.c
--- a/linux-2.6-xen-sparse/arch/i386/kernel/cpu/common-xen.c Tue Mar 21
16:55:44 2006
+++ b/linux-2.6-xen-sparse/arch/i386/kernel/cpu/common-xen.c Tue Mar 21
18:19:11 2006
@@ -283,10 +283,10 @@
c->x86_capability[4] = excap;
c->x86 = (tfms >> 8) & 15;
c->x86_model = (tfms >> 4) & 15;
- if (c->x86 == 0xf) {
+ if (c->x86 == 0xf)
c->x86 += (tfms >> 20) & 0xff;
+ if (c->x86 >= 0x6)
c->x86_model += ((tfms >> 16) & 0xF) << 4;
- }
c->x86_mask = tfms & 15;
} else {
/* Have CPUID level 0 only - unheard of */
diff -r f163677f8767 -r a9f5cf43451f
linux-2.6-xen-sparse/arch/i386/kernel/io_apic-xen.c
--- a/linux-2.6-xen-sparse/arch/i386/kernel/io_apic-xen.c Tue Mar 21
16:55:44 2006
+++ b/linux-2.6-xen-sparse/arch/i386/kernel/io_apic-xen.c Tue Mar 21
18:19:11 2006
@@ -92,6 +92,8 @@
static struct { int pin, apic; } ioapic_i8259 = { -1, -1 };
static DEFINE_SPINLOCK(ioapic_lock);
+
+int timer_over_8254 __initdata = 1;
/*
* Is the SiS APIC rmw bug present ?
@@ -2329,7 +2331,8 @@
apic_write_around(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_EXTINT);
init_8259A(1);
timer_ack = 1;
- enable_8259A_irq(0);
+ if (timer_over_8254 > 0)
+ enable_8259A_irq(0);
pin1 = find_isa_irq_pin(0, mp_INT);
apic1 = find_isa_irq_apic(0, mp_INT);
@@ -2459,6 +2462,20 @@
print_IO_APIC();
}
+static int __init setup_disable_8254_timer(char *s)
+{
+ timer_over_8254 = -1;
+ return 1;
+}
+static int __init setup_enable_8254_timer(char *s)
+{
+ timer_over_8254 = 2;
+ return 1;
+}
+
+__setup("disable_8254_timer", setup_disable_8254_timer);
+__setup("enable_8254_timer", setup_enable_8254_timer);
+
/*
* Called after all the initialization is done. If we didnt find any
* APIC bugs then we can allow the modify fast path
diff -r f163677f8767 -r a9f5cf43451f
linux-2.6-xen-sparse/arch/i386/kernel/microcode-xen.c
--- a/linux-2.6-xen-sparse/arch/i386/kernel/microcode-xen.c Tue Mar 21
16:55:44 2006
+++ b/linux-2.6-xen-sparse/arch/i386/kernel/microcode-xen.c Tue Mar 21
18:19:11 2006
@@ -25,6 +25,7 @@
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/sched.h>
+#include <linux/cpumask.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/vmalloc.h>
diff -r f163677f8767 -r a9f5cf43451f
linux-2.6-xen-sparse/arch/i386/kernel/setup-xen.c
--- a/linux-2.6-xen-sparse/arch/i386/kernel/setup-xen.c Tue Mar 21 16:55:44 2006
+++ b/linux-2.6-xen-sparse/arch/i386/kernel/setup-xen.c Tue Mar 21 18:19:11 2006
@@ -1819,6 +1819,10 @@
op.u.set_iopl.iopl = 1;
HYPERVISOR_physdev_op(&op);
+#ifdef CONFIG_X86_IO_APIC
+ check_acpi_pci(); /* Checks more than just ACPI actually */
+#endif
+
#ifdef CONFIG_ACPI
if (!(xen_start_info->flags & SIF_INITDOMAIN)) {
printk(KERN_INFO "ACPI in unprivileged domain disabled\n");
diff -r f163677f8767 -r a9f5cf43451f
linux-2.6-xen-sparse/arch/i386/kernel/smpboot.c
--- a/linux-2.6-xen-sparse/arch/i386/kernel/smpboot.c Tue Mar 21 16:55:44 2006
+++ b/linux-2.6-xen-sparse/arch/i386/kernel/smpboot.c Tue Mar 21 18:19:11 2006
@@ -1029,6 +1029,16 @@
int apicid, ret;
lock_cpu_hotplug();
+
+ /*
+ * On x86, CPU0 is never offlined. Trying to bring up an
+ * already-booted CPU will hang. So check for that case.
+ */
+ if (cpu_online(cpu)) {
+ ret = -EINVAL;
+ goto exit;
+ }
+
apicid = x86_cpu_to_apicid[cpu];
if (apicid == BAD_APICID) {
ret = -ENODEV;
diff -r f163677f8767 -r a9f5cf43451f
linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c
--- a/linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c Tue Mar 21 16:55:44 2006
+++ b/linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c Tue Mar 21 18:19:11 2006
@@ -157,8 +157,8 @@
}
__setup("independent_wallclock", __independent_wallclock);
-/* Permitted clock jitter, in usecs, beyond which a warning will be printed. */
-static unsigned long permitted_clock_jitter = 10000UL;
+/* Permitted clock jitter, in nsecs, beyond which a warning will be printed. */
+static unsigned long permitted_clock_jitter = 10000000UL; /* 10ms */
static int __init __permitted_clock_jitter(char *str)
{
permitted_clock_jitter = simple_strtoul(str, NULL, 0);
@@ -840,9 +840,9 @@
write_seqlock_irqsave(&xtime_lock, flags);
xtime.tv_sec = sec;
xtime.tv_nsec = 0;
+ jiffies_64 += sleep_length;
+ wall_jiffies += sleep_length;
write_sequnlock_irqrestore(&xtime_lock, flags);
- jiffies += sleep_length;
- wall_jiffies += sleep_length;
if (last_timer->resume)
last_timer->resume();
cur_timer = last_timer;
diff -r f163677f8767 -r a9f5cf43451f
linux-2.6-xen-sparse/arch/i386/mm/init-xen.c
--- a/linux-2.6-xen-sparse/arch/i386/mm/init-xen.c Tue Mar 21 16:55:44 2006
+++ b/linux-2.6-xen-sparse/arch/i386/mm/init-xen.c Tue Mar 21 18:19:11 2006
@@ -42,6 +42,11 @@
#include <asm/tlbflush.h>
#include <asm/sections.h>
#include <asm/hypervisor.h>
+#if defined(CONFIG_SWIOTLB)
+#include <linux/dma-mapping.h>
+#include <asm/scatterlist.h>
+#include <asm/swiotlb.h>
+#endif
extern unsigned long *contiguous_bitmap;
diff -r f163677f8767 -r a9f5cf43451f
linux-2.6-xen-sparse/arch/x86_64/kernel/entry-xen.S
--- a/linux-2.6-xen-sparse/arch/x86_64/kernel/entry-xen.S Tue Mar 21
16:55:44 2006
+++ b/linux-2.6-xen-sparse/arch/x86_64/kernel/entry-xen.S Tue Mar 21
18:19:11 2006
@@ -818,7 +818,7 @@
jmp error_exit
#ifdef CONFIG_X86_LOCAL_APIC
-ENTRY(nmi)
+KPROBE_ENTRY(nmi)
zeroentry do_nmi_callback
ENTRY(do_nmi_callback)
addq $8, %rsp
@@ -828,6 +828,7 @@
XEN_BLOCK_EVENTS(%rsi)
GET_THREAD_INFO(%rcx)
jmp retint_restore_args
+ .previous .text
#endif
ALIGN
diff -r f163677f8767 -r a9f5cf43451f linux-2.6-xen-sparse/drivers/char/tty_io.c
--- a/linux-2.6-xen-sparse/drivers/char/tty_io.c Tue Mar 21 16:55:44 2006
+++ b/linux-2.6-xen-sparse/drivers/char/tty_io.c Tue Mar 21 18:19:11 2006
@@ -305,7 +305,7 @@
t->commit = 0;
t->read = 0;
/* DEBUG ONLY */
- memset(t->data, '*', size);
+/* memset(t->data, '*', size); */
/* printk("Flip recycle %p\n", t); */
return t;
}
diff -r f163677f8767 -r a9f5cf43451f linux-2.6-xen-sparse/drivers/xen/Kconfig
--- a/linux-2.6-xen-sparse/drivers/xen/Kconfig Tue Mar 21 16:55:44 2006
+++ b/linux-2.6-xen-sparse/drivers/xen/Kconfig Tue Mar 21 18:19:11 2006
@@ -189,6 +189,14 @@
Disable serial port drivers, allowing the Xen console driver
to provide a serial console at ttyS0.
+config XEN_SYSFS
+ tristate "Export Xen attributes in sysfs"
+ depends on XEN
+ depends on SYSFS
+ default y
+ help
+ Xen hypervisor attributes will show up under /sys/hypervisor/.
+
endmenu
config HAVE_ARCH_ALLOC_SKB
diff -r f163677f8767 -r a9f5cf43451f
linux-2.6-xen-sparse/drivers/xen/core/Makefile
--- a/linux-2.6-xen-sparse/drivers/xen/core/Makefile Tue Mar 21 16:55:44 2006
+++ b/linux-2.6-xen-sparse/drivers/xen/core/Makefile Tue Mar 21 18:19:11 2006
@@ -7,3 +7,5 @@
obj-$(CONFIG_PROC_FS) += xen_proc.o
obj-$(CONFIG_NET) += skbuff.o
obj-$(CONFIG_SMP) += smpboot.o
+obj-$(CONFIG_SYSFS) += hypervisor_sysfs.o
+obj-$(CONFIG_XEN_SYSFS) += xen_sysfs.o
diff -r f163677f8767 -r a9f5cf43451f
linux-2.6-xen-sparse/drivers/xen/netback/xenbus.c
--- a/linux-2.6-xen-sparse/drivers/xen/netback/xenbus.c Tue Mar 21 16:55:44 2006
+++ b/linux-2.6-xen-sparse/drivers/xen/netback/xenbus.c Tue Mar 21 18:19:11 2006
@@ -213,7 +213,8 @@
break;
case XenbusStateClosed:
- kobject_uevent(&dev->dev.kobj, KOBJ_OFFLINE);
+ if (be->netif != NULL)
+ kobject_uevent(&dev->dev.kobj, KOBJ_OFFLINE);
device_unregister(&dev->dev);
break;
diff -r f163677f8767 -r a9f5cf43451f
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_dev.c
--- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_dev.c Tue Mar 21
16:55:44 2006
+++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_dev.c Tue Mar 21
18:19:11 2006
@@ -36,6 +36,7 @@
#include <linux/notifier.h>
#include <linux/wait.h>
#include <linux/fs.h>
+#include <linux/poll.h>
#include "xenbus_comms.h"
@@ -207,11 +208,22 @@
return 0;
}
+static unsigned int xenbus_dev_poll(struct file *file, poll_table *wait)
+{
+ struct xenbus_dev_data *u = file->private_data;
+
+ poll_wait(file, &u->read_waitq, wait);
+ if (u->read_cons != u->read_prod)
+ return POLLIN | POLLRDNORM;
+ return 0;
+}
+
static struct file_operations xenbus_dev_file_ops = {
.read = xenbus_dev_read,
.write = xenbus_dev_write,
.open = xenbus_dev_open,
.release = xenbus_dev_release,
+ .poll = xenbus_dev_poll,
};
static int __init
diff -r f163677f8767 -r a9f5cf43451f
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c
--- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c Tue Mar 21
16:55:44 2006
+++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c Tue Mar 21
18:19:11 2006
@@ -1049,6 +1049,8 @@
if (xsd_port_intf)
xsd_port_intf->read_proc = xsd_port_read;
}
+ else
+ xenstored_ready = 1;
/* Initialize the interface to xenstore. */
err = xs_init();
@@ -1058,10 +1060,8 @@
return err;
}
- if (!dom0) {
- xenstored_ready = 1;
+ if (!dom0)
xenbus_probe(NULL);
- }
return 0;
}
diff -r f163677f8767 -r a9f5cf43451f
linux-2.6-xen-sparse/include/asm-i386/apic.h
--- a/linux-2.6-xen-sparse/include/asm-i386/apic.h Tue Mar 21 16:55:44 2006
+++ b/linux-2.6-xen-sparse/include/asm-i386/apic.h Tue Mar 21 18:19:11 2006
@@ -139,6 +139,8 @@
#define ARCH_APICTIMER_STOPS_ON_C3 1
#endif
+extern int timer_over_8254;
+
#else /* !CONFIG_X86_LOCAL_APIC */
static inline void lapic_shutdown(void) { }
diff -r f163677f8767 -r a9f5cf43451f linux-2.6-xen-sparse/include/linux/gfp.h
--- a/linux-2.6-xen-sparse/include/linux/gfp.h Tue Mar 21 16:55:44 2006
+++ b/linux-2.6-xen-sparse/include/linux/gfp.h Tue Mar 21 18:19:11 2006
@@ -161,9 +161,9 @@
void page_alloc_init(void);
#ifdef CONFIG_NUMA
-void drain_remote_pages(void);
+void drain_node_pages(int node);
#else
-static inline void drain_remote_pages(void) { };
+static inline void drain_node_pages(int node) { };
#endif
#endif /* __LINUX_GFP_H */
diff -r f163677f8767 -r a9f5cf43451f linux-2.6-xen-sparse/mm/memory.c
--- a/linux-2.6-xen-sparse/mm/memory.c Tue Mar 21 16:55:44 2006
+++ b/linux-2.6-xen-sparse/mm/memory.c Tue Mar 21 18:19:11 2006
@@ -624,10 +624,11 @@
(*zap_work)--;
continue;
}
+
+ (*zap_work) -= PAGE_SIZE;
+
if (pte_present(ptent)) {
struct page *page;
-
- (*zap_work) -= PAGE_SIZE;
page = vm_normal_page(vma, addr, ptent);
if (unlikely(details) && page) {
diff -r f163677f8767 -r a9f5cf43451f linux-2.6-xen-sparse/mm/page_alloc.c
--- a/linux-2.6-xen-sparse/mm/page_alloc.c Tue Mar 21 16:55:44 2006
+++ b/linux-2.6-xen-sparse/mm/page_alloc.c Tue Mar 21 18:19:11 2006
@@ -591,20 +591,19 @@
}
#ifdef CONFIG_NUMA
-/* Called from the slab reaper to drain remote pagesets */
-void drain_remote_pages(void)
-{
- struct zone *zone;
- int i;
+/*
+ * Called from the slab reaper to drain pagesets on a particular node that
+ * belong to the currently executing processor.
+ */
+void drain_node_pages(int nodeid)
+{
+ int i, z;
unsigned long flags;
local_irq_save(flags);
- for_each_zone(zone) {
+ for (z = 0; z < MAX_NR_ZONES; z++) {
+ struct zone *zone = NODE_DATA(nodeid)->node_zones + z;
struct per_cpu_pageset *pset;
-
- /* Do not drain local pagesets */
- if (zone->zone_pgdat->node_id == numa_node_id())
- continue;
pset = zone_pcp(zone, smp_processor_id());
for (i = 0; i < ARRAY_SIZE(pset->pcp); i++) {
diff -r f163677f8767 -r a9f5cf43451f tools/console/client/main.c
--- a/tools/console/client/main.c Tue Mar 21 16:55:44 2006
+++ b/tools/console/client/main.c Tue Mar 21 18:19:11 2006
@@ -242,7 +242,7 @@
now = time(0);
while (str_pty == NULL && (now + 5) > time(0)) {
- struct timeval tv = { 0, 500 };
+ struct timeval tv = { 0, 250000 };
select(0, NULL, NULL, NULL, &tv); /* pause briefly */
str_pty = xs_read(xs, XBT_NULL, path, &len);
diff -r f163677f8767 -r a9f5cf43451f tools/firmware/rombios/apmbios.S
--- a/tools/firmware/rombios/apmbios.S Tue Mar 21 16:55:44 2006
+++ b/tools/firmware/rombios/apmbios.S Tue Mar 21 18:19:11 2006
@@ -217,14 +217,22 @@
; APM interface disconnect
APMSYM(04):
cmp al, #0x04
+ jne APMSYM(05)
+ jmp APMSYM(ok)
+
+;-----------------
+; APM cpu idle
+APMSYM(05):
+ cmp al, #0x05
jne APMSYM(07)
+ hlt
jmp APMSYM(ok)
;-----------------
; APM Set Power State
APMSYM(07):
cmp al, #0x07
- jne APMSYM(0a)
+ jne APMSYM(08)
cmp bx, #1
jne APMSYM(ok)
@@ -265,6 +273,14 @@
mov ax, #APMSYM(07_standby_str)
call APMSYM(out_str)
pop edx
+ jmp APMSYM(ok)
+
+;-----------------
+; APM Enable / Disable
+APMSYM(08):
+ cmp al, #0x08
+ jne APMSYM(0a)
+
jmp APMSYM(ok)
;-----------------
@@ -297,11 +313,30 @@
; APM Driver Version
APMSYM(0e):
cmp al, #0x0e
- jne APMSYM(unimplemented)
+ jne APMSYM(0f)
mov ah, #1
mov al, #2
+ jmp APMSYM(ok)
+
+;-----------------
+; APM Engage / Disengage
+APMSYM(0f):
+ cmp al, #0x0f
+ jne APMSYM(10)
+
+ jmp APMSYM(ok)
+
+;-----------------
+; APM Get Capabilities
+APMSYM(10):
+ cmp al, #0x10
+ jne APMSYM(unimplemented)
+
+ mov bl, #0
+ mov cx, #0
+
jmp APMSYM(ok)
;-----------------
diff -r f163677f8767 -r a9f5cf43451f tools/firmware/rombios/rombios.c
--- a/tools/firmware/rombios/rombios.c Tue Mar 21 16:55:44 2006
+++ b/tools/firmware/rombios/rombios.c Tue Mar 21 18:19:11 2006
@@ -149,7 +149,7 @@
#define BX_SUPPORT_FLOPPY 1
#define BX_FLOPPY_ON_CNT 37 /* 2 seconds */
#define BX_PCIBIOS 1
-#define BX_APM 0
+#define BX_APM 1
#define BX_USE_ATADRV 1
#define BX_ELTORITO_BOOT 1
diff -r f163677f8767 -r a9f5cf43451f tools/ioemu/hw/pcnet.h
--- a/tools/ioemu/hw/pcnet.h Tue Mar 21 16:55:44 2006
+++ b/tools/ioemu/hw/pcnet.h Tue Mar 21 18:19:11 2006
@@ -225,9 +225,11 @@
((uint32_t *)tmd)[3] = 0;
}
else
- if (BCR_SWSTYLE(s) != 3)
- cpu_physical_memory_read(addr, (void *)tmd, 16);
- else {
+ if (BCR_SWSTYLE(s) != 3) {
+ ((uint32_t *)tmd)[2] = 0;
+ cpu_physical_memory_read(addr+4, (void *)&tmd->tmd1, 4);
+ cpu_physical_memory_read(addr, (void *)&tmd->tmd0, 4);
+ } else {
uint32_t xda[4];
cpu_physical_memory_read(addr,
(void *)&xda[0], sizeof(xda));
@@ -253,9 +255,10 @@
cpu_physical_memory_set_dirty(addr+7);
}
else {
- if (BCR_SWSTYLE(s) != 3)
- cpu_physical_memory_write(addr, (void *)tmd, 16);
- else {
+ if (BCR_SWSTYLE(s) != 3) {
+ cpu_physical_memory_write(addr+8, (void *)&tmd->tmd2, 4);
+ cpu_physical_memory_write(addr+4, (void *)&tmd->tmd1, 4);
+ } else {
uint32_t xda[4];
xda[0] = ((uint32_t *)tmd)[2];
xda[1] = ((uint32_t *)tmd)[1];
@@ -282,9 +285,11 @@
((uint32_t *)rmd)[3] = 0;
}
else
- if (BCR_SWSTYLE(s) != 3)
- cpu_physical_memory_read(addr, (void *)rmd, 16);
- else {
+ if (BCR_SWSTYLE(s) != 3) {
+ rmd->rmd2.zeros = 0;
+ cpu_physical_memory_read(addr+4, (void *)&rmd->rmd1, 4);
+ cpu_physical_memory_read(addr, (void *)&rmd->rmd0, 4);
+ } else {
uint32_t rda[4];
cpu_physical_memory_read(addr,
(void *)&rda[0], sizeof(rda));
@@ -310,9 +315,10 @@
cpu_physical_memory_set_dirty(addr+7);
}
else {
- if (BCR_SWSTYLE(s) != 3)
- cpu_physical_memory_write(addr, (void *)rmd, 16);
- else {
+ if (BCR_SWSTYLE(s) != 3) {
+ cpu_physical_memory_write(addr+8, (void *)&rmd->rmd2, 4);
+ cpu_physical_memory_write(addr+4, (void *)&rmd->rmd1, 4);
+ } else {
uint32_t rda[4];
rda[0] = ((uint32_t *)rmd)[2];
rda[1] = ((uint32_t *)rmd)[1];
@@ -339,8 +345,7 @@
#define CHECK_RMD(ADDR,RES) do { \
struct pcnet_RMD rmd; \
RMDLOAD(&rmd,(ADDR)); \
- (RES) |= (rmd.rmd1.ones != 15) \
- || (rmd.rmd2.zeros != 0); \
+ (RES) |= (rmd.rmd1.ones != 15); \
} while (0)
#define CHECK_TMD(ADDR,RES) do { \
diff -r f163677f8767 -r a9f5cf43451f tools/libxc/xc_hvm_build.c
--- a/tools/libxc/xc_hvm_build.c Tue Mar 21 16:55:44 2006
+++ b/tools/libxc/xc_hvm_build.c Tue Mar 21 18:19:11 2006
@@ -51,7 +51,7 @@
char *elfbase, int xch, uint32_t dom, unsigned long *parray,
struct domain_setup_info *dsi);
-static unsigned char build_e820map(void *e820_page, unsigned long mem_size)
+static unsigned char build_e820map(void *e820_page, unsigned long long
mem_size)
{
struct e820entry *e820entry =
(struct e820entry *)(((unsigned char *)e820_page) + E820_MAP_OFFSET);
@@ -81,11 +81,17 @@
#define STATIC_PAGES 2 /* for ioreq_t and store_mfn */
/* Most of the ram goes here */
e820entry[nr_map].addr = 0x100000;
- e820entry[nr_map].size = mem_size - 0x100000 - STATIC_PAGES*PAGE_SIZE;
+ e820entry[nr_map].size = mem_size - 0x100000 - STATIC_PAGES * PAGE_SIZE;
e820entry[nr_map].type = E820_RAM;
nr_map++;
/* Statically allocated special pages */
+
+ /* For xenstore */
+ e820entry[nr_map].addr = mem_size - 2 * PAGE_SIZE;
+ e820entry[nr_map].size = PAGE_SIZE;
+ e820entry[nr_map].type = E820_XENSTORE;
+ nr_map++;
/* Shared ioreq_t page */
e820entry[nr_map].addr = mem_size - PAGE_SIZE;
@@ -93,12 +99,6 @@
e820entry[nr_map].type = E820_SHARED_PAGE;
nr_map++;
- /* For xenstore */
- e820entry[nr_map].addr = mem_size - 2*PAGE_SIZE;
- e820entry[nr_map].size = PAGE_SIZE;
- e820entry[nr_map].type = E820_XENSTORE;
- nr_map++;
-
e820entry[nr_map].addr = mem_size;
e820entry[nr_map].size = 0x3 * PAGE_SIZE;
e820entry[nr_map].type = E820_NVS;
@@ -117,8 +117,7 @@
return (*(((unsigned char *)e820_page) + E820_MAP_NR_OFFSET) = nr_map);
}
-static void
-set_hvm_info_checksum(struct hvm_info_table *t)
+static void set_hvm_info_checksum(struct hvm_info_table *t)
{
uint8_t *ptr = (uint8_t *)t, sum = 0;
unsigned int i;
@@ -142,19 +141,16 @@
char *va_map;
struct hvm_info_table *va_hvm;
-
- va_map = xc_map_foreign_range(
- xc_handle,
- dom,
- PAGE_SIZE,
- PROT_READ|PROT_WRITE,
- pfn_list[HVM_INFO_PFN]);
+ va_map = xc_map_foreign_range(xc_handle, dom, PAGE_SIZE,
+ PROT_READ | PROT_WRITE,
+ pfn_list[HVM_INFO_PFN]);
if ( va_map == NULL )
return -1;
va_hvm = (struct hvm_info_table *)(va_map + HVM_INFO_OFFSET);
memset(va_hvm, 0, sizeof(*va_hvm));
+
strncpy(va_hvm->signature, "HVM INFO", 8);
va_hvm->length = sizeof(struct hvm_info_table);
va_hvm->acpi_enabled = acpi;
@@ -183,58 +179,59 @@
unsigned long *store_mfn)
{
unsigned long *page_array = NULL;
-
unsigned long count, i;
+ unsigned long long ptr;
+ xc_mmu_t *mmu = NULL;
+
shared_info_t *shared_info;
void *e820_page;
unsigned char e820_map_nr;
- xc_mmu_t *mmu = NULL;
- int rc;
struct domain_setup_info dsi;
- unsigned long v_end;
+ unsigned long long v_end;
unsigned long shared_page_frame = 0;
shared_iopage_t *sp;
memset(&dsi, 0, sizeof(struct domain_setup_info));
- if ( (rc = parseelfimage(image, image_size, &dsi)) != 0 )
- goto error_out;
-
- if ( (dsi.v_start & (PAGE_SIZE-1)) != 0 )
+ if ( (parseelfimage(image, image_size, &dsi)) != 0 )
+ goto error_out;
+
+ if ( (dsi.v_kernstart & (PAGE_SIZE - 1)) != 0 )
{
PERROR("Guest OS must load to a page boundary.\n");
goto error_out;
}
/* memsize is in megabytes */
- v_end = (unsigned long)memsize << 20;
+ v_end = (unsigned long long)memsize << 20;
printf("VIRTUAL MEMORY ARRANGEMENT:\n"
- " Loaded HVM loader: %08lx->%08lx\n"
- " TOTAL: %08lx->%08lx\n",
+ " Loaded HVM loader: %08lx->%08lx\n"
+ " TOTAL: %08lx->%016llx\n",
dsi.v_kernstart, dsi.v_kernend,
dsi.v_start, v_end);
- printf(" ENTRY ADDRESS: %08lx\n", dsi.v_kernentry);
-
- if ( (v_end - dsi.v_start) > (nr_pages * PAGE_SIZE) )
- {
- ERROR("Initial guest OS requires too much space\n"
- "(%luMB is greater than %luMB limit)\n",
- (v_end-dsi.v_start)>>20, (nr_pages<<PAGE_SHIFT)>>20);
+ printf(" ENTRY ADDRESS: %08lx\n", dsi.v_kernentry);
+
+ if ( (v_end - dsi.v_start) > ((unsigned long long)nr_pages << PAGE_SHIFT) )
+ {
+ PERROR("Initial guest OS requires too much space: "
+ "(%lluMB is greater than %lluMB limit)\n",
+ (unsigned long long)(v_end - dsi.v_start) >> 20,
+ ((unsigned long long)nr_pages << PAGE_SHIFT) >> 20);
goto error_out;
}
if ( (page_array = malloc(nr_pages * sizeof(unsigned long))) == NULL )
{
- PERROR("Could not allocate memory");
+ PERROR("Could not allocate memory.\n");
goto error_out;
}
if ( xc_get_pfn_list(xc_handle, dom, page_array, nr_pages) != nr_pages )
{
- PERROR("Could not get the page frame list");
+ PERROR("Could not get the page frame list.\n");
goto error_out;
}
@@ -246,20 +243,21 @@
/* Write the machine->phys table entries. */
for ( count = 0; count < nr_pages; count++ )
{
+ ptr = (unsigned long long)page_array[count] << PAGE_SHIFT;
if ( xc_add_mmu_update(xc_handle, mmu,
- (page_array[count] << PAGE_SHIFT) |
- MMU_MACHPHYS_UPDATE, count) )
+ ptr | MMU_MACHPHYS_UPDATE, count) )
goto error_out;
}
- if ( set_hvm_info(xc_handle, dom, page_array, vcpus, pae, acpi, apic) ) {
- fprintf(stderr, "Couldn't set hvm info for HVM guest.\n");
+ if ( set_hvm_info(xc_handle, dom, page_array, vcpus, pae, acpi, apic) )
+ {
+ ERROR("Couldn't set hvm info for HVM guest.\n");
goto error_out;
}
if ( (e820_page = xc_map_foreign_range(
- xc_handle, dom, PAGE_SIZE, PROT_READ|PROT_WRITE,
- page_array[E820_MAP_PAGE >> PAGE_SHIFT])) == 0 )
+ xc_handle, dom, PAGE_SIZE, PROT_READ | PROT_WRITE,
+ page_array[E820_MAP_PAGE >> PAGE_SHIFT])) == 0 )
goto error_out;
memset(e820_page, 0, PAGE_SIZE);
e820_map_nr = build_e820map(e820_page, v_end);
@@ -267,8 +265,8 @@
/* shared_info page starts its life empty. */
if ( (shared_info = xc_map_foreign_range(
- xc_handle, dom, PAGE_SIZE, PROT_READ|PROT_WRITE,
- shared_info_frame)) == 0 )
+ xc_handle, dom, PAGE_SIZE, PROT_READ | PROT_WRITE,
+ shared_info_frame)) == 0 )
goto error_out;
memset(shared_info, 0, sizeof(shared_info_t));
/* Mask all upcalls... */
@@ -279,8 +277,8 @@
/* Populate the event channel port in the shared page */
shared_page_frame = page_array[(v_end >> PAGE_SHIFT) - 1];
if ( (sp = (shared_iopage_t *) xc_map_foreign_range(
- xc_handle, dom, PAGE_SIZE, PROT_READ|PROT_WRITE,
- shared_page_frame)) == 0 )
+ xc_handle, dom, PAGE_SIZE, PROT_READ | PROT_WRITE,
+ shared_page_frame)) == 0 )
goto error_out;
memset(sp, 0, PAGE_SIZE);
@@ -290,7 +288,7 @@
vp_eport = xc_evtchn_alloc_unbound(xc_handle, dom, 0);
if ( vp_eport < 0 ) {
- fprintf(stderr, "Couldn't get unbound port from VMX guest.\n");
+ PERROR("Couldn't get unbound port from VMX guest.\n");
goto error_out;
}
sp->vcpu_iodata[i].vp_eport = vp_eport;
diff -r f163677f8767 -r a9f5cf43451f tools/libxc/xc_ptrace.c
--- a/tools/libxc/xc_ptrace.c Tue Mar 21 16:55:44 2006
+++ b/tools/libxc/xc_ptrace.c Tue Mar 21 18:19:11 2006
@@ -251,35 +251,39 @@
if (fetch_regs(xc_handle, cpu, NULL))
return NULL;
- if ( ctxt[cpu].ctrlreg[3] != cr3_phys[cpu] )
- {
- cr3_phys[cpu] = ctxt[cpu].ctrlreg[3];
- if ( cr3_virt[cpu] )
- munmap(cr3_virt[cpu], PAGE_SIZE);
- cr3_virt[cpu] = xc_map_foreign_range(
- xc_handle, current_domid, PAGE_SIZE, PROT_READ,
- cr3_phys[cpu] >> PAGE_SHIFT);
- if ( cr3_virt[cpu] == NULL )
+ if (paging_enabled(&ctxt[cpu])) {
+ if ( ctxt[cpu].ctrlreg[3] != cr3_phys[cpu] )
+ {
+ cr3_phys[cpu] = ctxt[cpu].ctrlreg[3];
+ if ( cr3_virt[cpu] )
+ munmap(cr3_virt[cpu], PAGE_SIZE);
+ cr3_virt[cpu] = xc_map_foreign_range(
+ xc_handle, current_domid, PAGE_SIZE, PROT_READ,
+ cr3_phys[cpu] >> PAGE_SHIFT);
+ if ( cr3_virt[cpu] == NULL )
+ return NULL;
+ }
+ if ( (pde = cr3_virt[cpu][vtopdi(va)]) == 0 )
return NULL;
- }
- if ( (pde = cr3_virt[cpu][vtopdi(va)]) == 0 )
- return NULL;
- if ( (ctxt[cpu].flags & VGCF_HVM_GUEST) && paging_enabled(&ctxt[cpu]) )
- pde = page_array[pde >> PAGE_SHIFT] << PAGE_SHIFT;
- if ( pde != pde_phys[cpu] )
- {
- pde_phys[cpu] = pde;
- if ( pde_virt[cpu] )
- munmap(pde_virt[cpu], PAGE_SIZE);
- pde_virt[cpu] = xc_map_foreign_range(
- xc_handle, current_domid, PAGE_SIZE, PROT_READ,
- pde_phys[cpu] >> PAGE_SHIFT);
- if ( pde_virt[cpu] == NULL )
+ if ( (ctxt[cpu].flags & VGCF_HVM_GUEST) && paging_enabled(&ctxt[cpu]) )
+ pde = page_array[pde >> PAGE_SHIFT] << PAGE_SHIFT;
+ if ( pde != pde_phys[cpu] )
+ {
+ pde_phys[cpu] = pde;
+ if ( pde_virt[cpu] )
+ munmap(pde_virt[cpu], PAGE_SIZE);
+ pde_virt[cpu] = xc_map_foreign_range(
+ xc_handle, current_domid, PAGE_SIZE, PROT_READ,
+ pde_phys[cpu] >> PAGE_SHIFT);
+ if ( pde_virt[cpu] == NULL )
+ return NULL;
+ }
+ if ( (page = pde_virt[cpu][vtopti(va)]) == 0 )
return NULL;
- }
- if ( (page = pde_virt[cpu][vtopti(va)]) == 0 )
- return NULL;
- if ( (ctxt[cpu].flags & VGCF_HVM_GUEST) && paging_enabled(&ctxt[cpu]) )
+ } else {
+ page = va;
+ }
+ if (ctxt[cpu].flags & VGCF_HVM_GUEST)
page = page_array[page >> PAGE_SHIFT] << PAGE_SHIFT;
if ( (page != page_phys[cpu]) || (perm != prev_perm[cpu]) )
{
diff -r f163677f8767 -r a9f5cf43451f tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py Tue Mar 21 16:55:44 2006
+++ b/tools/python/xen/xend/XendDomainInfo.py Tue Mar 21 18:19:11 2006
@@ -24,6 +24,7 @@
"""
+import errno
import logging
import string
import time
@@ -893,7 +894,7 @@
self.domid, timeout)
threading.Timer(timeout, self.refreshShutdown).start()
- return 1
+ return True
def shutdown(self, reason):
@@ -1246,30 +1247,34 @@
"""Cleanup domain resources; release devices. Idempotent. Nothrow
guarantee."""
- self.unwatchShutdown()
-
- self.release_devices()
-
- if self.image:
+ self.refresh_shutdown_lock.acquire()
+ try:
+ self.unwatchShutdown()
+
+ self.release_devices()
+
+ if self.image:
+ try:
+ self.image.destroy()
+ except:
+ log.exception(
+ "XendDomainInfo.cleanup: image.destroy() failed.")
+ self.image = None
+
try:
- self.image.destroy()
+ self.removeDom()
except:
- log.exception(
- "XendDomainInfo.cleanup: image.destroy() failed.")
- self.image = None
-
- try:
- self.removeDom()
- except:
- log.exception("Removing domain path failed.")
-
- try:
- if not self.info['name'].startswith(ZOMBIE_PREFIX):
- self.info['name'] = ZOMBIE_PREFIX + self.info['name']
- except:
- log.exception("Renaming Zombie failed.")
-
- self.state_set(STATE_DOM_SHUTDOWN)
+ log.exception("Removing domain path failed.")
+
+ try:
+ if not self.info['name'].startswith(ZOMBIE_PREFIX):
+ self.info['name'] = ZOMBIE_PREFIX + self.info['name']
+ except:
+ log.exception("Renaming Zombie failed.")
+
+ self.state_set(STATE_DOM_SHUTDOWN)
+ finally:
+ self.refresh_shutdown_lock.release()
def cleanupVm(self):
@@ -1301,7 +1306,8 @@
def unwatchShutdown(self):
"""Remove the watch on the domain's control/shutdown node, if any.
- Idempotent. Nothrow guarantee."""
+ Idempotent. Nothrow guarantee. Expects to be protected by the
+ refresh_shutdown_lock."""
try:
try:
diff -r f163677f8767 -r a9f5cf43451f tools/python/xen/xm/create.py
--- a/tools/python/xen/xm/create.py Tue Mar 21 16:55:44 2006
+++ b/tools/python/xen/xm/create.py Tue Mar 21 18:19:11 2006
@@ -14,7 +14,7 @@
#============================================================================
# Copyright (C) 2004, 2005 Mike Wray <mike.wray@xxxxxx>
# Copyright (C) 2005 Nguyen Anh Quynh <aquynh@xxxxxxxxx>
-# Copyright (C) 2005 XenSource Ltd
+# Copyright (C) 2005-2006 XenSource Ltd
#============================================================================
"""Domain creation.
@@ -27,8 +27,6 @@
import commands
import time
import re
-
-import xen.lowlevel.xc
from xen.xend import sxp
from xen.xend import PrettyPrint
@@ -90,10 +88,6 @@
SXP is the underlying configuration format used by Xen.
SXP configurations can be hand-written or generated from Python
configuration
scripts, using the -n (dryrun) option to print the configuration.""")
-
-gopts.opt('load', short='L', val='FILE',
- fn=set_value, default=None,
- use='Domain saved state to load.')
gopts.opt('dryrun', short='n',
fn=set_true, default=0,
@@ -819,11 +813,7 @@
"""
try:
- if opts.vals.load:
- filename = os.path.abspath(opts.vals.load)
- dominfo = server.xend_domain_restore(filename, config)
- else:
- dominfo = server.xend_domain_create(config)
+ dominfo = server.xend_domain_create(config)
except XendError, ex:
import signal
if vncpid:
diff -r f163677f8767 -r a9f5cf43451f tools/xm-test/lib/XmTestLib/XenDomain.py
--- a/tools/xm-test/lib/XmTestLib/XenDomain.py Tue Mar 21 16:55:44 2006
+++ b/tools/xm-test/lib/XmTestLib/XenDomain.py Tue Mar 21 18:19:11 2006
@@ -74,7 +74,7 @@
"vcpus" : 1,
"acpi" : 0,
"apic" : 0,
- "disk" : ["file:%s/disk.img,ioemu:%s,w" %
+ "disk" : ["file:%s/disk.img,ioemu:%s,w!" %
(getRdPath(), BLOCK_ROOT_DEV)],
"kernel" : "/usr/lib/xen/boot/hvmloader",
"builder" : "hvm",
@@ -251,9 +251,6 @@
if ENABLE_HVM_SUPPORT:
waitForBoot()
- def startNow(self):
- XenDomain.start(self)
-
def minSafeMem(self):
return 16
diff -r f163677f8767 -r a9f5cf43451f tools/xm-test/lib/XmTestReport/Report.py
--- a/tools/xm-test/lib/XmTestReport/Report.py Tue Mar 21 16:55:44 2006
+++ b/tools/xm-test/lib/XmTestReport/Report.py Tue Mar 21 18:19:11 2006
@@ -32,11 +32,7 @@
import httplib
import urllib
import re
-
-#REPORT_HOST = "xmtest-dev.dague.org"
-REPORT_HOST = "xmtest.dague.org"
-REPORT_URL = "/cgi-bin/report-results";
-VIEW_URL = "cgi-bin/display?view=single&testid="
+from urlparse import urlparse
class XmTestReport:
@@ -88,8 +84,11 @@
return 'multipart/form-data; boundary=%s' % boundary, textBody
-def postResults(results):
- conn = httplib.HTTPConnection(REPORT_HOST)
+def postResults(report_server, results):
+ if not re.match('http://', report_server):
+ report_server = 'http://'+report_server
+ (report_host,report_url) = urlparse(report_server)[1:3]
+ conn = httplib.HTTPConnection(report_host)
type, body = encodeForm({"log" : results})
@@ -100,22 +99,17 @@
# print "%s\n" % type
# print headers
- conn.request("POST", REPORT_URL, body, headers)
+ conn.request("POST", report_url, body, headers)
resp = conn.getresponse()
data = resp.read()
if resp.status == 200:
print >>sys.stderr, "Your results have been submitted successfully!"
- match = re.match("^id=([0-9]+)$", data.split("\n")[1])
- if match:
- id = match.group(1)
- print >>sys.stderr, "See your report at:"
- print >>sys.stderr, "http://%s/%s%s" % (REPORT_HOST, VIEW_URL, id)
else:
print >>sys.stderr, "Unable to submit results:"
- print >>sys.stderr, "[http://%s%s] said %i: %s" % (REPORT_HOST,
- REPORT_URL,
+ print >>sys.stderr, "[http://%s%s] said %i: %s" % (report_host,
+ report_url,
resp.status,
resp.reason)
print >>sys.stderr, data
@@ -133,7 +127,9 @@
dump = False
files = []
- for a in sys.argv[1:]:
+ report_server = sys.argv[1]
+
+ for a in sys.argv[2:]:
if a == "-d":
submit = False
dump = True
@@ -156,5 +152,5 @@
print xmlout
if submit:
- postResults(xmlout)
+ postResults(report_server, xmlout)
diff -r f163677f8767 -r a9f5cf43451f tools/xm-test/ramdisk/Makefile.am
--- a/tools/xm-test/ramdisk/Makefile.am Tue Mar 21 16:55:44 2006
+++ b/tools/xm-test/ramdisk/Makefile.am Tue Mar 21 18:19:11 2006
@@ -13,6 +13,8 @@
XMTEST_MAJ_VER = $(shell echo @PACKAGE_VERSION@ | perl -pe
's/(\d+)\.(\d+)\.\d+/\1.\2/')
XMTEST_VER_IMG = initrd-$(XMTEST_MAJ_VER).img
+
+EXTRA_ROOT_DIRS = sys
if HVM
all: initrd.img disk.img
@@ -36,7 +38,8 @@
$(XMTEST_VER_IMG): $(BR_IMG)
chmod a+x skel/etc/init.d/rcS
- (cd skel; tar cf - .) | (cd $(BR_SRC)/$(BR_ROOT); tar xvf -)
+ (cd skel; mkdir -p $(EXTRA_ROOT_DIRS); tar cf - .) \
+ | (cd $(BR_SRC)/$(BR_ROOT); tar xvf -)
cd $(BR_SRC) && make
cp $(BR_IMG) initrd-$(XMTEST_MAJ_VER).img
diff -r f163677f8767 -r a9f5cf43451f tools/xm-test/ramdisk/skel/etc/init.d/rcS
--- a/tools/xm-test/ramdisk/skel/etc/init.d/rcS Tue Mar 21 16:55:44 2006
+++ b/tools/xm-test/ramdisk/skel/etc/init.d/rcS Tue Mar 21 18:19:11 2006
@@ -2,3 +2,7 @@
mount -a
+# If we're running 2.6, make sure /sys is mounted
+if uname -r | grep -q '^2.6'; then
+ mount -t sysfs none /sys
+fi
diff -r f163677f8767 -r a9f5cf43451f tools/xm-test/runtest.sh
--- a/tools/xm-test/runtest.sh Tue Mar 21 16:55:44 2006
+++ b/tools/xm-test/runtest.sh Tue Mar 21 18:19:11 2006
@@ -13,7 +13,9 @@
echo " -b : do not ask any questions (batch mode)"
echo " -g : run a group test set"
echo " -e <email> : set email address for report"
+ echo " -r <url> : url of test results repository to use"
echo " -s <report> : just submit report <report>"
+ echo " -u : unsafe -- do not run the sanity checks before
starting"
echo " -h | --help : show this help"
}
@@ -22,7 +24,7 @@
reportfile=$1
- ./lib/XmTestReport/Report.py $reportfile
+ ./lib/XmTestReport/Report.py $reportserver $reportfile
}
# Generate XML result report from output file
@@ -189,8 +191,10 @@
# Defaults
MAXFAIL=10
report=yes
+reportserver=${xmtest_repo:-'http://xmtest.dague.org/cgi-bin/report-results'}
batch=no
run=yes
+unsafe=no
GROUPENTERED=default
# Resolve options
@@ -218,8 +222,17 @@
exit 1
fi
;;
+ -r)
+ shift
+ reportserver=$1
+ ;;
-s)
run=no
+ ;;
+ -u)
+ echo "(Unsafe mode)"
+ unsafe=yes
+ report=no
;;
-h|--help)
usage
@@ -264,15 +277,25 @@
fi
fi
+if [ "$GROUPENTERED" != "default" ]; then
+ report=no;
+fi
+
if [ "$run" != "no" ]; then
- runnable_tests
- make_environment_report $OSREPORTTEMP $PROGREPORTTEMP
+ if [ "$unsafe" = "no" ]; then
+ runnable_tests
+ fi
+ rm -f $REPORT"*"
+ if [ "$unsafe" = "no" ]; then
+ make_environment_report $OSREPORTTEMP $PROGREPORTTEMP
+ fi
run_tests $GROUPENTERED $OUTPUT
make_text_reports $PASSFAIL $FAILURES $OUTPUT $TXTREPORT
- make_result_report $OUTPUT $RESULTREPORTTEMP
- cat $OSREPORTTEMP $PROGREPORTTEMP $RESULTREPORTTEMP > $XMLREPORT
- rm $OSREPORTTEMP $PROGREPORTTEMP $RESULTREPORTTEMP
-
+ if [ "$unsafe" = "no" ]; then
+ make_result_report $OUTPUT $RESULTREPORTTEMP
+ cat $OSREPORTTEMP $PROGREPORTTEMP $RESULTREPORTTEMP > $XMLREPORT
+ rm $OSREPORTTEMP $PROGREPORTTEMP $RESULTREPORTTEMP
+ fi
fi
if [ "$report" = "yes" ]; then
diff -r f163677f8767 -r a9f5cf43451f
tools/xm-test/tests/create/10_create_fastdestroy.py
--- a/tools/xm-test/tests/create/10_create_fastdestroy.py Tue Mar 21
16:55:44 2006
+++ b/tools/xm-test/tests/create/10_create_fastdestroy.py Tue Mar 21
18:19:11 2006
@@ -28,7 +28,7 @@
for i in range(0,50):
domain = XmTestDomain("testdomain")
try:
- domain.startNow()
+ domain.start()
except DomainError,e:
print "Failed: " + e.extra
NSPerror = check_for_NSP_error(e.extra)
diff -r f163677f8767 -r a9f5cf43451f
tools/xm-test/tests/destroy/07_destroy_stale_pos.py
--- a/tools/xm-test/tests/destroy/07_destroy_stale_pos.py Tue Mar 21
16:55:44 2006
+++ b/tools/xm-test/tests/destroy/07_destroy_stale_pos.py Tue Mar 21
18:19:11 2006
@@ -101,29 +101,24 @@
if not re.search("[Ee]rror", output):
FAIL("sysrq failed to report error after destroy!")
-def runTests(tests, wait):
+def runTests(tests):
for test in tests:
domain = XmTestDomain()
# Create a domain
try:
- if wait:
- domain.start()
- else:
- domain.startNow()
+ domain.start()
except DomainError, e:
FAIL(str(e))
-
- if wait:
- # Attach a console and make sure it's live
- try:
- console = XmConsole(domain.getName())
- console.sendInput("foo")
- console.runCmd("ls")
- except ConsoleError, e:
- FAIL(str(e))
+ # Attach a console and make sure it's live
+ try:
+ console = XmConsole(domain.getName())
+ console.sendInput("foo")
+ console.runCmd("ls")
+ except ConsoleError, e:
+ FAIL(str(e))
# Destroy it
@@ -137,9 +132,5 @@
test_block_list, test_shutdown, test_domid, test_domname]
if verbose:
- print "Running stale tests (nice mode)"
-runTests(tests, True)
-
-if verbose:
- print "Running stale tests (mean mode)"
-runTests(tests, False)
+ print "Running stale tests"
+runTests(tests)
diff -r f163677f8767 -r a9f5cf43451f
tools/xm-test/tests/vcpu-pin/01_vcpu-pin_basic_pos.py
--- a/tools/xm-test/tests/vcpu-pin/01_vcpu-pin_basic_pos.py Tue Mar 21
16:55:44 2006
+++ b/tools/xm-test/tests/vcpu-pin/01_vcpu-pin_basic_pos.py Tue Mar 21
18:19:11 2006
@@ -46,3 +46,5 @@
if cpu != 1:
FAIL("failed to switch VCPU 0 to CPU 1")
+
+domain.stop()
diff -r f163677f8767 -r a9f5cf43451f
tools/xm-test/tests/vtpm/01_vtpm-list_pos.py
--- a/tools/xm-test/tests/vtpm/01_vtpm-list_pos.py Tue Mar 21 16:55:44 2006
+++ b/tools/xm-test/tests/vtpm/01_vtpm-list_pos.py Tue Mar 21 18:19:11 2006
@@ -1,21 +1,16 @@
#!/usr/bin/python
# Copyright (C) International Business Machines Corp., 2006
-# Author: Stefan Berger <stefanb@xxxxxxxxxx)
+# Author: Stefan Berger <stefanb@xxxxxxxxxx>
# Positive Test: create domain with virtual TPM attached at build time,
# verify list
from XmTestLib import *
-
-def vtpm_cleanup(domName):
- # Since this is only a temporary domain I clean up the domain from the
- # virtual TPM directory
- traceCommand("/etc/xen/scripts/vtpm-delete %s" % domName)
-
-if ENABLE_HVM_SUPPORT:
- SKIP("vtpm-list not supported for HVM domains")
+from vtpm_utils import *
+import commands
+import os
config = {"vtpm":"instance=1,backend=0"}
domain = XmTestDomain(extraConfig=config)
diff -r f163677f8767 -r a9f5cf43451f
tools/xm-test/tests/vtpm/02_vtpm-cat_pcrs.py
--- a/tools/xm-test/tests/vtpm/02_vtpm-cat_pcrs.py Tue Mar 21 16:55:44 2006
+++ b/tools/xm-test/tests/vtpm/02_vtpm-cat_pcrs.py Tue Mar 21 18:19:11 2006
@@ -1,30 +1,17 @@
#!/usr/bin/python
# Copyright (C) International Business Machines Corp., 2006
-# Author: Stefan Berger <stefanb@xxxxxxxxxx)
+# Author: Stefan Berger <stefanb@xxxxxxxxxx>
# Positive Test: create domain with virtual TPM attached at build time,
# check list of pcrs
from XmTestLib import *
+from vtpm_utils import *
+import commands
+import os
+import os.path
-def vtpm_cleanup(domName):
- # Since this is only a temporary domain I clean up the domain from the
- # virtual TPM directory
- traceCommand("/etc/xen/scripts/vtpm-delete %s" % domName)
-
-if ENABLE_HVM_SUPPORT:
- SKIP("vtpm-list not supported for HVM domains")
-
-status, output = traceCommand("ls /dev/tpm0")
-if re.search("No such file or directory",output):
- SKIP("This machine has no hardware TPM; cannot run this test")
-
-status, output = traceCommand("ps aux | grep vtpm_manager | grep -v grep")
-if output == "":
- FAIL("virtual TPM manager must be started to run this test")
-
-# vtpm manager has been detected
config = {"vtpm":"instance=1,backend=0"}
domain = XmTestDomain(extraConfig=config)
@@ -46,20 +33,10 @@
try:
console.sendInput("input")
- run = console.runCmd("ls /sys")
except ConsoleError, e:
saveLog(console.getHistory())
vtpm_cleanup(domName)
FAIL(str(e))
-
-if re.search("No such file",run["output"]):
- try:
- run = console.runCmd("mkdir /sys")
- run = console.runCmd("mount -t sysfs /sys /sys")
- except ConsoleError, e:
- saveLog(console.getHistory())
- vtpm_cleanup(domName)
- FAIL(str(e))
try:
run = console.runCmd("cat /sys/devices/platform/tpm_vtpm/pcrs")
diff -r f163677f8767 -r a9f5cf43451f tools/xm-test/tests/vtpm/Makefile.am
--- a/tools/xm-test/tests/vtpm/Makefile.am Tue Mar 21 16:55:44 2006
+++ b/tools/xm-test/tests/vtpm/Makefile.am Tue Mar 21 18:19:11 2006
@@ -1,13 +1,12 @@
-
SUBDIRS =
TESTS = 01_vtpm-list_pos.test \
- 02_vtpm-cat_pcrs.test
+ 02_vtpm-cat_pcrs.test \
+ 03_vtpm-susp_res.test
XFAIL_TESTS =
-EXTRA_DIST = $(TESTS) $(XFAIL_TESTS)
-
+EXTRA_DIST = $(TESTS) $(XFAIL_TESTS) vtpm_utils.py
TESTS_ENVIRONMENT=@TENV@
%.test: %.py
diff -r f163677f8767 -r a9f5cf43451f xen/Makefile
--- a/xen/Makefile Tue Mar 21 16:55:44 2006
+++ b/xen/Makefile Tue Mar 21 18:19:11 2006
@@ -55,12 +55,7 @@
[ -e include/asm ] || ln -sf asm-$(TARGET_ARCH) include/asm
$(MAKE) -C arch/$(TARGET_ARCH) asm-offsets.s
$(MAKE) include/asm-$(TARGET_ARCH)/asm-offsets.h
- $(MAKE) -C common
- $(MAKE) -C drivers
-ifeq ($(ACM_SECURITY),y)
- $(MAKE) -C acm
-endif
- $(MAKE) -C arch/$(TARGET_ARCH)
+ $(MAKE) -C arch/$(TARGET_ARCH) $(TARGET)
# drivers/char/console.o contains static banner/compile info. Blow it away.
# Don't refresh these files during e.g., 'sudo make install'
diff -r f163677f8767 -r a9f5cf43451f xen/Rules.mk
--- a/xen/Rules.mk Tue Mar 21 16:55:44 2006
+++ b/xen/Rules.mk Tue Mar 21 18:19:11 2006
@@ -7,6 +7,15 @@
perfc ?= n
perfc_arrays?= n
crash_debug ?= n
+
+# Hardcoded configuration implications and dependencies.
+# Do this is a neater way if it becomes unwieldy.
+ifeq ($(debug),y)
+verbose := y
+endif
+ifeq ($(perfc_arrays),y)
+perfc := y
+endif
XEN_ROOT=$(BASEDIR)/..
include $(XEN_ROOT)/Config.mk
@@ -27,41 +36,23 @@
HDRS := $(subst $(BASEDIR)/include/xen/banner.h,,$(HDRS))
HDRS := $(subst $(BASEDIR)/include/xen/compile.h,,$(HDRS))
-C_SRCS := $(wildcard *.c)
-S_SRCS := $(wildcard *.S)
-OBJS := $(patsubst %.S,%.o,$(S_SRCS))
-OBJS += $(patsubst %.c,%.o,$(C_SRCS))
+include $(BASEDIR)/arch/$(TARGET_ARCH)/Rules.mk
# Note that link order matters!
-ALL_OBJS := $(BASEDIR)/common/common.o
-ALL_OBJS += $(BASEDIR)/drivers/char/driver.o
-ALL_OBJS += $(BASEDIR)/drivers/acpi/driver.o
-ifeq ($(ACM_SECURITY),y)
-ALL_OBJS += $(BASEDIR)/acm/acm.o
-CFLAGS += -DACM_SECURITY
-endif
-ALL_OBJS += $(BASEDIR)/arch/$(TARGET_ARCH)/arch.o
+ALL_OBJS-y += $(BASEDIR)/common/built_in.o
+ALL_OBJS-y += $(BASEDIR)/drivers/built_in.o
+ALL_OBJS-$(ACM_SECURITY) += $(BASEDIR)/acm/built_in.o
+ALL_OBJS-y += $(BASEDIR)/arch/$(TARGET_ARCH)/built_in.o
-include $(BASEDIR)/arch/$(TARGET_ARCH)/Rules.mk
+CFLAGS-y += -g -D__XEN__
+CFLAGS-$(ACM_SECURITY) += -DACM_SECURITY
+CFLAGS-$(verbose) += -DVERBOSE
+CFLAGS-$(crash_debug) += -DCRASH_DEBUG
+CFLAGS-$(perfc) += -DPERF_COUNTERS
+CFLAGS-$(perfc_arrays) += -DPERF_ARRAYS
-CFLAGS += -g -D__XEN__
-
-ifneq ($(debug)$(verbose),nn)
-CFLAGS += -DVERBOSE
-endif
-
-ifeq ($(crash_debug),y)
-CFLAGS += -DCRASH_DEBUG
-endif
-
-ifeq ($(perfc),y)
-CFLAGS += -DPERF_COUNTERS
-ifeq ($(perfc_arrays),y)
-CFLAGS += -DPERF_ARRAYS
-endif
-endif
-
-CFLAGS := $(strip $(CFLAGS))
+ALL_OBJS := $(ALL_OBJS-y)
+CFLAGS := $(strip $(CFLAGS) $(CFLAGS-y))
%.o: %.c $(HDRS) Makefile
$(CC) $(CFLAGS) -c $< -o $@
diff -r f163677f8767 -r a9f5cf43451f xen/acm/Makefile
--- a/xen/acm/Makefile Tue Mar 21 16:55:44 2006
+++ b/xen/acm/Makefile Tue Mar 21 18:19:11 2006
@@ -1,15 +1,9 @@
+include $(BASEDIR)/Rules.mk
-include $(BASEDIR)/Rules.mk
-OBJS = acm_core.o
-OBJS += acm_policy.o
-OBJS += acm_simple_type_enforcement_hooks.o
-OBJS += acm_chinesewall_hooks.o
-OBJS += acm_null_hooks.o
+obj-y += acm_core.o
+obj-y += acm_policy.o
+obj-y += acm_simple_type_enforcement_hooks.o
+obj-y += acm_chinesewall_hooks.o
+obj-y += acm_null_hooks.o
-default: acm.o
-
-acm.o: $(OBJS)
- $(LD) $(LDFLAGS) -r -o acm.o $(OBJS)
-
-clean:
- rm -f *.o *~ core
+include $(BASEDIR)/Post.mk
diff -r f163677f8767 -r a9f5cf43451f xen/arch/ia64/Makefile
--- a/xen/arch/ia64/Makefile Tue Mar 21 16:55:44 2006
+++ b/xen/arch/ia64/Makefile Tue Mar 21 18:19:11 2006
@@ -1,63 +1,23 @@
include $(BASEDIR)/Rules.mk
-VPATH = xen vmx linux linux-xen
+subdir-y += xen
+subdir-y += vmx
+subdir-y += linux
+subdir-y += linux-xen
-OBJS = xensetup.o setup.o time.o irq.o process.o smp.o \
- xenmisc.o acpi.o hypercall.o \
- machvec.o dom0_ops.o domain.o hpsimserial.o pcdp.o \
- idle0_task.o pal.o hpsim.o efi.o efi_stub.o ivt.o mm_contig.o \
- xenmem.o sal.o cmdline.o mm_init.o tlb.o smpboot.o \
- extable.o linuxextable.o sort.o xenirq.o xentime.o \
- regionreg.o entry.o unaligned.o privop.o vcpu.o \
- irq_ia64.o irq_lsapic.o vhpt.o xenasm.o hyperprivop.o dom_fw.o \
- sn_console.o # ia64_ksyms.o
+include $(BASEDIR)/Post.mk
-OBJS += vmx_init.o vmx_virt.o vmx_vcpu.o vmx_process.o vmx_vsa.o vmx_ivt.o\
- vmx_phy_mode.o vmx_utility.o vmx_interrupt.o vmx_entry.o vmmu.o \
- vtlb.o mmio.o vlsapic.o vmx_hypercall.o mm.o vmx_support.o \
- pal_emul.o vmx_irq_ia64.o hvm_vioapic.o
-
-# lib files from xen/arch/ia64/linux/ (linux/arch/ia64/lib)
-OBJS += bitop.o clear_page.o flush.o copy_page_mck.o
\
- memset.o strlen.o memcpy_mck.o \
- __divsi3.o __udivsi3.o __modsi3.o __umodsi3.o \
- __divdi3.o __udivdi3.o __moddi3.o __umoddi3.o
-
-ifeq ($(crash_debug),y)
-OBJS += gdbstub.o
-endif
-
-# xen stack unwinder
-# unwind_decoder.c is included in unwind.c
-OBJS += unwind.o
-#unwind.o: CFLAGS += -DUNW_DEBUG=4
-
-OBJS += process-linux-xen.o
-
-# perfmon.o
-# unwind.o needed for kernel unwinding (rare)
-
-OBJS := $(subst $(TARGET_ARCH)/asm-offsets.o,,$(OBJS))
-
-# remove following line if not privifying in memory
-# OBJS += privify.o
-
-default: $(TARGET)
-
-$(CURDIR)/arch.o: $(OBJS)
- $(LD) -r -o $@ $(OBJS)
-
-$(TARGET)-syms: $(ALL_OBJS) head.o xen.lds.s
- $(LD) $(LDFLAGS) -T $(BASEDIR)/arch/$(TARGET_ARCH)/xen.lds.s -N \
- -Map map.out head.o $(ALL_OBJS) -o $@
+$(TARGET)-syms: linux-xen/head.o $(ALL_OBJS) xen.lds.s
+ $(LD) $(LDFLAGS) -T xen.lds.s -N \
+ -Map map.out linux-xen/head.o $(ALL_OBJS) -o $@
$(NM) -n $@ | $(BASEDIR)/tools/symbols > $(BASEDIR)/xen-syms.S
$(MAKE) $(BASEDIR)/xen-syms.o
- $(LD) $(LDFLAGS) -T $(BASEDIR)/arch/$(TARGET_ARCH)/xen.lds.s -N \
- -Map map.out head.o $(ALL_OBJS) $(BASEDIR)/xen-syms.o -o $@
+ $(LD) $(LDFLAGS) -T xen.lds.s -N \
+ -Map map.out linux-xen/head.o $(ALL_OBJS) $(BASEDIR)/xen-syms.o
-o $@
$(NM) -n $@ | $(BASEDIR)/tools/symbols >$(BASEDIR)/xen-syms.S
$(MAKE) $(BASEDIR)/xen-syms.o
- $(LD) $(LDFLAGS) -T $(BASEDIR)/arch/$(TARGET_ARCH)/xen.lds.s -N \
- -Map map.out head.o $(ALL_OBJS) $(BASEDIR)/xen-syms.o -o $@
+ $(LD) $(LDFLAGS) -T xen.lds.s -N \
+ -Map map.out linux-xen/head.o $(ALL_OBJS) $(BASEDIR)/xen-syms.o
-o $@
rm -f $(BASEDIR)/xen-syms.S $(BASEDIR)/xen-syms.o
$(TARGET): $(TARGET)-syms
@@ -119,31 +79,9 @@
$(CC) -E $(CPPFLAGS) -P -DXEN -D__ASSEMBLY__ \
-o xen.lds.s xen/xen.lds.S
-# variants of divide/modulo
-# see files in xen/arch/ia64/linux/lib (linux/arch/ia64/lib)
-__divdi3.o: idiv64.S
- $(CC) $(AFLAGS) $(AFLAGS_KERNEL) -c -o $@ $<
-__udivdi3.o: idiv64.S
- $(CC) $(AFLAGS) $(AFLAGS_KERNEL) -c -DUNSIGNED -c -o $@ $<
-__moddi3.o: idiv64.S
- $(CC) $(AFLAGS) $(AFLAGS_KERNEL) -c -DMODULO -c -o $@ $<
-__umoddi3.o: idiv64.S
- $(CC) $(AFLAGS) $(AFLAGS_KERNEL) -c -DMODULO -DUNSIGNED -c -o $@ $<
-__divsi3.o: idiv32.S
- $(CC) $(AFLAGS) $(AFLAGS_KERNEL) -c -o $@ $<
-__udivsi3.o: idiv32.S
- $(CC) $(AFLAGS) $(AFLAGS_KERNEL) -c -DUNSIGNED -c -o $@ $<
-__modsi3.o: idiv32.S
- $(CC) $(AFLAGS) $(AFLAGS_KERNEL) -c -DMODULO -c -o $@ $<
-__umodsi3.o: idiv32.S
- $(CC) $(AFLAGS) $(AFLAGS_KERNEL) -c -DMODULO -DUNSIGNED -c -o $@ $<
-
-
-clean:
+clean:: FORCE
rm -f *.o *~ core xen.lds.s
$(BASEDIR)/include/asm-ia64/.offsets.h.stamp asm-offsets.s map.out
rm -f asm-xsi-offsets.s $(BASEDIR)/include/asm-ia64/asm-xsi-offsets.h
- rm -f $(BASEDIR)/arch/ia64/vmx/hvm_*.c
+ rm -f $(BASEDIR)/System.map
+ rm -f vmx/hvm_*.c
rm -rf $(BASEDIR)/include/asm-ia64/hvm
- rm -f linux/lib/*.o
-
-.PHONY: default clean
diff -r f163677f8767 -r a9f5cf43451f xen/arch/ia64/Rules.mk
--- a/xen/arch/ia64/Rules.mk Tue Mar 21 16:55:44 2006
+++ b/xen/arch/ia64/Rules.mk Tue Mar 21 18:19:11 2006
@@ -1,6 +1,7 @@
########################################
# ia64-specific definitions
+HAS_ACPI := y
VALIDATE_VT ?= n
ifneq ($(COMPILE_ARCH),$(TARGET_ARCH))
CROSS_COMPILE ?= /usr/local/sp_env/v2.2.5/i686/bin/ia64-unknown-linux-
diff -r f163677f8767 -r a9f5cf43451f xen/arch/x86/Makefile
--- a/xen/arch/x86/Makefile Tue Mar 21 16:55:44 2006
+++ b/xen/arch/x86/Makefile Tue Mar 21 18:19:11 2006
@@ -1,57 +1,59 @@
-
include $(BASEDIR)/Rules.mk
-OBJS += $(patsubst %.S,%.o,$(wildcard $(TARGET_SUBARCH)/*.S))
-OBJS += $(patsubst %.c,%.o,$(wildcard $(TARGET_SUBARCH)/*.c))
-OBJS += $(patsubst %.c,%.o,$(wildcard acpi/*.c))
-OBJS += $(patsubst %.c,%.o,$(wildcard genapic/*.c))
-OBJS += $(patsubst %.c,%.o,$(wildcard cpu/*.c))
-OBJS += $(patsubst %.c,%.o,$(wildcard cpu/mcheck/*.c))
-OBJS += $(patsubst %.c,%.o,$(wildcard cpu/mtrr/*.c))
-OBJS += $(patsubst %.c,%.o,$(wildcard hvm/*.c))
-OBJS += $(patsubst %.c,%.o,$(wildcard hvm/vmx/*.c))
-OBJS += $(patsubst %.S,%.o,$(wildcard hvm/vmx/$(TARGET_SUBARCH)/*.S))
-OBJS += $(patsubst %.c,%.o,$(wildcard hvm/svm/*.c))
-OBJS += $(patsubst %.S,%.o,$(wildcard hvm/svm/$(TARGET_SUBARCH)/*.S))
+subdir-y += acpi
+subdir-y += cpu
+subdir-y += genapic
+subdir-y += hvm
-ifeq ($(TARGET_SUBARCH),x86_64)
-OBJS := $(subst cpu/centaur.o,,$(OBJS))
-OBJS := $(subst cpu/cyrix.o,,$(OBJS))
-OBJS := $(subst cpu/rise.o,,$(OBJS))
-OBJS := $(subst cpu/transmeta.o,,$(OBJS))
+subdir-$(x86_32) += x86_32
+subdir-$(x86_64) += x86_64
+
+obj-y += apic.o
+obj-y += audit.o
+obj-y += bitops.o
+obj-y += delay.o
+obj-y += dmi_scan.o
+obj-y += dom0_ops.o
+obj-y += domain.o
+obj-y += domain_build.o
+obj-y += e820.o
+obj-y += extable.o
+obj-y += flushtlb.o
+obj-y += i387.o
+obj-y += i8259.o
+obj-y += io_apic.o
+obj-y += irq.o
+obj-y += microcode.o
+obj-y += mm.o
+obj-y += mpparse.o
+obj-y += nmi.o
+obj-y += physdev.o
+obj-y += rwlock.o
+obj-y += setup.o
+obj-y += smp.o
+obj-y += smpboot.o
+obj-y += string.o
+obj-y += time.o
+obj-y += trampoline.o
+obj-y += traps.o
+obj-y += usercopy.o
+obj-y += x86_emulate.o
+
+ifneq ($(pae),n)
+obj-$(x86_32) += shadow.o shadow_public.o shadow_guest32.o
+else
+obj-$(x86_32) += shadow32.o
endif
-OBJS := $(patsubst shadow%.o,,$(OBJS)) # drop all
-ifeq ($(TARGET_SUBARCH),x86_64)
- OBJS += shadow.o shadow_public.o shadow_guest32.o shadow_guest32pae.o #
x86_64: new code
-endif
-ifeq ($(TARGET_SUBARCH),x86_32)
- ifneq ($(pae),n)
- OBJS += shadow.o shadow_public.o shadow_guest32.o # x86_32p: new code
- else
- OBJS += shadow32.o # x86_32: old code
- endif
-endif
+obj-$(x86_64) += shadow.o shadow_public.o shadow_guest32.o shadow_guest32pae.o
-ifneq ($(supervisor_mode_kernel),y)
-OBJS := $(subst x86_32/supervisor_mode_kernel.o,,$(OBJS))
-endif
+obj-$(crash_debug) += gdbstub.o
-OBJS := $(subst $(TARGET_SUBARCH)/asm-offsets.o,,$(OBJS))
-OBJS := $(subst $(TARGET_SUBARCH)/xen.lds.o,,$(OBJS))
-
-ifneq ($(crash_debug),y)
-OBJS := $(patsubst gdbstub%.o,,$(OBJS))
-endif
-
-default: $(TARGET)
+include $(BASEDIR)/Post.mk
$(TARGET): $(TARGET)-syms boot/mkelf32
./boot/mkelf32 $(TARGET)-syms $(TARGET) 0x100000 \
`$(NM) $(TARGET)-syms | sort | tail -n 1 | sed -e 's/^\([^
]*\).*/0x\1/'`
-
-$(CURDIR)/arch.o: $(OBJS)
- $(LD) $(LDFLAGS) -r -o $@ $(OBJS)
$(TARGET)-syms: boot/$(TARGET_SUBARCH).o $(ALL_OBJS) xen.lds
$(LD) $(LDFLAGS) -T xen.lds -N \
@@ -77,21 +79,5 @@
shadow_guest32.o: shadow.c
-clean:
- rm -f *.o *.s *~ core boot/*.o boot/*~ boot/core boot/mkelf32
- rm -f x86_32/*.o x86_32/*~ x86_32/core
- rm -f x86_64/*.o x86_64/*~ x86_64/core
- rm -f mtrr/*.o mtrr/*~ mtrr/core
- rm -f acpi/*.o acpi/*~ acpi/core
- rm -f genapic/*.o genapic/*~ genapic/core
- rm -f cpu/*.o cpu/*~ cpu/core
- rm -f hvm/*.o hvm/*~ hvm/core
- rm -f hvm/vmx/*.o hvm/vmx/*~ hvm/vmx/core
- rm -f hvm/vmx/x86_32/*.o hvm/vmx/x86_32/*~ hvm/vmx/x86_32/core
- rm -f hvm/vmx/x86_64/*.o hvm/vmx/x86_64/*~ hvm/vmx/x86_64/core
- rm -f hvm/svm/*.o hvm/svm/*~ hvm/svm/core
- rm -f hvm/svm/x86_32/*.o hvm/svm/x86_32/*~ hvm/svm/x86_32/core
- rm -f hvm/svm/x86_64/*.o hvm/svm/x86_64/*~ hvm/svm/x86_64/core
- rm -f xen.lds
-
-.PHONY: default clean
+clean:: FORCE
+ rm -f asm-offsets.s xen.lds boot/*.o boot/*~ boot/core boot/mkelf32
diff -r f163677f8767 -r a9f5cf43451f xen/arch/x86/Rules.mk
--- a/xen/arch/x86/Rules.mk Tue Mar 21 16:55:44 2006
+++ b/xen/arch/x86/Rules.mk Tue Mar 21 18:19:11 2006
@@ -1,5 +1,7 @@
########################################
# x86-specific definitions
+
+HAS_ACPI := y
#
# If you change any of these configuration options then you must
@@ -31,13 +33,17 @@
endif
ifeq ($(XEN_TARGET_ARCH),x86_32)
-LDFLAGS += -m elf_i386
+LDFLAGS += -m elf_i386
+x86_32 := y
+x86_64 := n
endif
ifeq ($(TARGET_SUBARCH),x86_64)
CFLAGS += -mno-red-zone -fpic -fno-reorder-blocks
CFLAGS += -fno-asynchronous-unwind-tables
LDFLAGS += -m elf_x86_64
+x86_32 := n
+x86_64 := y
endif
# Test for at least GCC v3.2.x.
diff -r f163677f8767 -r a9f5cf43451f xen/arch/x86/domain.c
--- a/xen/arch/x86/domain.c Tue Mar 21 16:55:44 2006
+++ b/xen/arch/x86/domain.c Tue Mar 21 18:19:11 2006
@@ -51,6 +51,9 @@
} __cacheline_aligned;
static struct percpu_ctxt percpu_ctxt[NR_CPUS];
+static void paravirt_ctxt_switch_from(struct vcpu *v);
+static void paravirt_ctxt_switch_to(struct vcpu *v);
+
static void continue_idle_domain(struct vcpu *v)
{
reset_stack_and_jump(idle_loop);
@@ -225,6 +228,9 @@
{
v->arch.schedule_tail = continue_nonidle_domain;
}
+
+ v->arch.ctxt_switch_from = paravirt_ctxt_switch_from;
+ v->arch.ctxt_switch_to = paravirt_ctxt_switch_to;
v->arch.perdomain_ptes =
d->arch.mm_perdomain_pt + (vcpu_id << GDT_LDT_VCPU_SHIFT);
@@ -685,21 +691,32 @@
percpu_ctxt[smp_processor_id()].dirty_segment_mask = dirty_segment_mask;
}
-#define switch_kernel_stack(_n,_c) ((void)0)
+#define switch_kernel_stack(v) ((void)0)
#elif defined(__i386__)
#define load_segments(n) ((void)0)
#define save_segments(p) ((void)0)
-static inline void switch_kernel_stack(struct vcpu *n, unsigned int cpu)
-{
- struct tss_struct *tss = &init_tss[cpu];
- tss->esp1 = n->arch.guest_context.kernel_sp;
- tss->ss1 = n->arch.guest_context.kernel_ss;
-}
-
-#endif
+static inline void switch_kernel_stack(struct vcpu *v)
+{
+ struct tss_struct *tss = &init_tss[smp_processor_id()];
+ tss->esp1 = v->arch.guest_context.kernel_sp;
+ tss->ss1 = v->arch.guest_context.kernel_ss;
+}
+
+#endif /* __i386__ */
+
+static void paravirt_ctxt_switch_from(struct vcpu *v)
+{
+ save_segments(v);
+}
+
+static void paravirt_ctxt_switch_to(struct vcpu *v)
+{
+ set_int80_direct_trap(v);
+ switch_kernel_stack(v);
+}
#define loaddebug(_v,_reg) \
__asm__ __volatile__ ("mov %0,%%db" #_reg : : "r" ((_v)->debugreg[_reg]))
@@ -720,15 +737,7 @@
stack_regs,
CTXT_SWITCH_STACK_BYTES);
unlazy_fpu(p);
- if ( !hvm_guest(p) )
- {
- save_segments(p);
- }
- else
- {
- hvm_save_segments(p);
- hvm_load_msrs();
- }
+ p->arch.ctxt_switch_from(p);
}
if ( !is_idle_vcpu(n) )
@@ -749,15 +758,7 @@
loaddebug(&n->arch.guest_context, 7);
}
- if ( !hvm_guest(n) )
- {
- set_int80_direct_trap(n);
- switch_kernel_stack(n, cpu);
- }
- else
- {
- hvm_restore_msrs(n);
- }
+ n->arch.ctxt_switch_to(n);
}
if ( p->domain != n->domain )
diff -r f163677f8767 -r a9f5cf43451f xen/arch/x86/genapic/default.c
--- a/xen/arch/x86/genapic/default.c Tue Mar 21 16:55:44 2006
+++ b/xen/arch/x86/genapic/default.c Tue Mar 21 18:19:11 2006
@@ -18,6 +18,15 @@
#include <asm/mach-default/mach_ipi.h>
#include <asm/mach-default/mach_mpparse.h>
+#ifdef CONFIG_HOTPLUG_CPU
+#define DEFAULT_SEND_IPI (1)
+#else
+#define DEFAULT_SEND_IPI (0)
+#endif
+
+int no_broadcast = DEFAULT_SEND_IPI;
+integer_param("no_ipi_broadcast", no_broadcast);
+
/* should be called last. */
static __init int probe_default(void)
{
@@ -25,3 +34,12 @@
}
struct genapic apic_default = APIC_INIT("default", probe_default);
+
+static int __init print_ipi_mode(void)
+{
+ if (genapic == &apic_default)
+ printk("Using IPI %sShortcut mode\n",
+ no_broadcast ? "No-" : "");
+ return 0;
+}
+__initcall(print_ipi_mode);
diff -r f163677f8767 -r a9f5cf43451f xen/arch/x86/genapic/es7000.h
--- a/xen/arch/x86/genapic/es7000.h Tue Mar 21 16:55:44 2006
+++ b/xen/arch/x86/genapic/es7000.h Tue Mar 21 18:19:11 2006
@@ -23,6 +23,15 @@
*
* http://www.unisys.com
*/
+
+/*
+ * ES7000 chipsets
+ */
+
+#define NON_UNISYS 0
+#define ES7000_CLASSIC 1
+#define ES7000_ZORRO 2
+
#define MIP_REG 1
#define MIP_PSAI_REG 4
@@ -104,7 +113,8 @@
#define MIP_SW_APIC 0x1020b
#define MIP_FUNC(VALUE) (VALUE & 0xff)
-extern int parse_unisys_oem (char *oemptr, int oem_entries);
-extern int find_unisys_acpi_oem_table(unsigned long *oem_addr, int *length);
+extern int parse_unisys_oem (char *oemptr);
+extern int find_unisys_acpi_oem_table(unsigned long *oem_addr);
+extern void setup_unisys(void);
extern int es7000_start_cpu(int cpu, unsigned long eip);
extern void es7000_sw_apic(void);
diff -r f163677f8767 -r a9f5cf43451f xen/arch/x86/genapic/es7000plat.c
--- a/xen/arch/x86/genapic/es7000plat.c Tue Mar 21 16:55:44 2006
+++ b/xen/arch/x86/genapic/es7000plat.c Tue Mar 21 18:19:11 2006
@@ -49,7 +49,7 @@
int mip_port;
unsigned long mip_addr, host_addr;
-#if defined(CONFIG_X86_IO_APIC) && (defined(CONFIG_ACPI_INTERPRETER) ||
defined(CONFIG_ACPI_BOOT))
+#if defined(CONFIG_X86_IO_APIC) && defined(CONFIG_ACPI)
/*
* GSI override for ES7000 platforms.
@@ -60,6 +60,9 @@
static int
es7000_rename_gsi(int ioapic, int gsi)
{
+ if (es7000_plat == ES7000_ZORRO)
+ return gsi;
+
if (!base) {
int i;
for (i = 0; i < nr_ioapics; i++)
@@ -71,14 +74,31 @@
return gsi;
}
-#endif // (CONFIG_X86_IO_APIC) && (CONFIG_ACPI_INTERPRETER || CONFIG_ACPI_BOOT)
+#endif /* (CONFIG_X86_IO_APIC) && (CONFIG_ACPI) */
+
+void __init
+setup_unisys(void)
+{
+ /*
+ * Determine the generation of the ES7000 currently running.
+ *
+ * es7000_plat = 1 if the machine is a 5xx ES7000 box
+ * es7000_plat = 2 if the machine is a x86_64 ES7000 box
+ *
+ */
+ if (!(boot_cpu_data.x86 <= 15 && boot_cpu_data.x86_model <= 2))
+ es7000_plat = ES7000_ZORRO;
+ else
+ es7000_plat = ES7000_CLASSIC;
+ ioapic_renumber_irq = es7000_rename_gsi;
+}
/*
* Parse the OEM Table
*/
int __init
-parse_unisys_oem (char *oemptr, int oem_entries)
+parse_unisys_oem (char *oemptr)
{
int i;
int success = 0;
@@ -93,7 +113,7 @@
tp += 8;
- for (i=0; i <= oem_entries; i++) {
+ for (i=0; i <= 6; i++) {
type = *tp++;
size = *tp++;
tp -= 2;
@@ -128,40 +148,24 @@
default:
break;
}
- if (i == 6) break;
tp += size;
}
if (success < 2) {
- es7000_plat = 0;
- } else {
- printk("\nEnabling ES7000 specific features...\n");
- /*
- * Determine the generation of the ES7000 currently running.
- *
- * es7000_plat = 0 if the machine is NOT a Unisys ES7000 box
- * es7000_plat = 1 if the machine is a 5xx ES7000 box
- * es7000_plat = 2 if the machine is a x86_64 ES7000 box
- *
- */
- if (!(boot_cpu_data.x86 <= 15 && boot_cpu_data.x86_model <= 2))
- es7000_plat = 2;
- else
- es7000_plat = 1;
-
- ioapic_renumber_irq = es7000_rename_gsi;
- }
+ es7000_plat = NON_UNISYS;
+ } else
+ setup_unisys();
return es7000_plat;
}
int __init
-find_unisys_acpi_oem_table(unsigned long *oem_addr, int *length)
+find_unisys_acpi_oem_table(unsigned long *oem_addr)
{
struct acpi_table_rsdp *rsdp = NULL;
unsigned long rsdp_phys = 0;
struct acpi_table_header *header = NULL;
int i;
- struct acpi_table_sdt sdt = { 0 };
+ struct acpi_table_sdt sdt = { 0 }; /* initialise sdt.count */
rsdp_phys = acpi_find_rsdp();
rsdp = __va(rsdp_phys);
@@ -199,13 +203,11 @@
acpi_table_print(header, sdt.entry[i].pa);
t = (struct oem_table *)
__acpi_map_table(sdt.entry[i].pa, header->length);
addr = (void *)
__acpi_map_table(t->OEMTableAddr, t->OEMTableSize);
- *length = header->length;
*oem_addr = (unsigned long) addr;
return 0;
}
}
}
- Dprintk("ES7000: did not find Unisys ACPI OEM table!\n");
return -1;
}
@@ -298,7 +300,7 @@
void __init
es7000_sw_apic()
{
- if (es7000_plat == 1) {
+ if (es7000_plat) {
int mip_status;
struct mip_reg es7000_mip_reg;
diff -r f163677f8767 -r a9f5cf43451f xen/arch/x86/hvm/intercept.c
--- a/xen/arch/x86/hvm/intercept.c Tue Mar 21 16:55:44 2006
+++ b/xen/arch/x86/hvm/intercept.c Tue Mar 21 18:19:11 2006
@@ -338,10 +338,10 @@
static __inline__ void missed_ticks(struct hvm_virpit*vpit)
{
- int missed_ticks;
+ int missed_ticks;
missed_ticks = (NOW() - vpit->scheduled)/(s_time_t) vpit->period;
- if ( missed_ticks > 0 ) {
+ if ( missed_ticks++ >= 0 ) {
vpit->pending_intr_nr += missed_ticks;
vpit->scheduled += missed_ticks * vpit->period;
}
@@ -355,22 +355,16 @@
/* pick up missed timer tick */
missed_ticks(vpit);
-
- vpit->pending_intr_nr++;
if ( test_bit(_VCPUF_running, &v->vcpu_flags) ) {
- vpit->scheduled += vpit->period;
set_timer(&vpit->pit_timer, vpit->scheduled);
}
}
+/* pick up missed timer ticks at deactive time */
void pickup_deactive_ticks(struct hvm_virpit *vpit)
{
-
if ( !active_timer(&(vpit->pit_timer)) ) {
- /* pick up missed timer tick */
missed_ticks(vpit);
-
- vpit->scheduled += vpit->period;
set_timer(&vpit->pit_timer, vpit->scheduled);
}
}
diff -r f163677f8767 -r a9f5cf43451f xen/arch/x86/hvm/svm/svm.c
--- a/xen/arch/x86/hvm/svm/svm.c Tue Mar 21 16:55:44 2006
+++ b/xen/arch/x86/hvm/svm/svm.c Tue Mar 21 18:19:11 2006
@@ -200,7 +200,8 @@
return 1;
}
-void svm_store_cpu_guest_regs(struct vcpu *v, struct cpu_user_regs *regs)
+static void svm_store_cpu_guest_regs(
+ struct vcpu *v, struct cpu_user_regs *regs)
{
struct vmcb_struct *vmcb = v->arch.hvm_svm.vmcb;
@@ -227,23 +228,11 @@
#endif
}
-void svm_load_cpu_guest_regs(struct vcpu *v, struct cpu_user_regs *regs)
+static void svm_load_cpu_guest_regs(
+ struct vcpu *v, struct cpu_user_regs *regs)
{
svm_load_cpu_user_regs(v, regs);
}
-
-#ifdef __x86_64__
-
-void svm_save_segments(struct vcpu *v)
-{
-}
-void svm_load_msrs(void)
-{
-}
-void svm_restore_msrs(struct vcpu *v)
-{
-}
-#endif
#define IS_CANO_ADDRESS(add) 1
@@ -458,12 +447,6 @@
hvm_funcs.store_cpu_guest_regs = svm_store_cpu_guest_regs;
hvm_funcs.load_cpu_guest_regs = svm_load_cpu_guest_regs;
-
-#ifdef __x86_64__
- hvm_funcs.save_segments = svm_save_segments;
- hvm_funcs.load_msrs = svm_load_msrs;
- hvm_funcs.restore_msrs = svm_restore_msrs;
-#endif
hvm_funcs.store_cpu_guest_ctrl_regs = svm_store_cpu_guest_ctrl_regs;
hvm_funcs.modify_guest_state = svm_modify_guest_state;
@@ -687,9 +670,19 @@
reset_stack_and_jump(svm_asm_do_launch);
}
+static void svm_ctxt_switch_from(struct vcpu *v)
+{
+}
+
+static void svm_ctxt_switch_to(struct vcpu *v)
+{
+}
+
void svm_final_setup_guest(struct vcpu *v)
{
- v->arch.schedule_tail = arch_svm_do_launch;
+ v->arch.schedule_tail = arch_svm_do_launch;
+ v->arch.ctxt_switch_from = svm_ctxt_switch_from;
+ v->arch.ctxt_switch_to = svm_ctxt_switch_to;
if (v == v->domain->vcpu[0])
{
diff -r f163677f8767 -r a9f5cf43451f xen/arch/x86/hvm/vmx/io.c
--- a/xen/arch/x86/hvm/vmx/io.c Tue Mar 21 16:55:44 2006
+++ b/xen/arch/x86/hvm/vmx/io.c Tue Mar 21 18:19:11 2006
@@ -40,20 +40,33 @@
#define BSP_CPU(v) (!(v->vcpu_id))
-void vmx_set_tsc_shift(struct vcpu *v, struct hvm_virpit *vpit)
-{
- u64 drift;
-
- if ( vpit->first_injected )
- drift = vpit->period_cycles * vpit->pending_intr_nr;
- else
- drift = 0;
- vpit->shift = v->arch.hvm_vmx.tsc_offset - drift;
- __vmwrite(TSC_OFFSET, vpit->shift);
-
+static inline
+void __set_tsc_offset(u64 offset)
+{
+ __vmwrite(TSC_OFFSET, offset);
#if defined (__i386__)
- __vmwrite(TSC_OFFSET_HIGH, ((vpit->shift)>> 32));
+ __vmwrite(TSC_OFFSET_HIGH, offset >> 32);
#endif
+}
+
+u64 get_guest_time(struct vcpu *v)
+{
+ struct hvm_virpit *vpit = &(v->domain->arch.hvm_domain.vpit);
+ u64 host_tsc;
+
+ rdtscll(host_tsc);
+ return host_tsc + vpit->cache_tsc_offset;
+}
+
+void set_guest_time(struct vcpu *v, u64 gtime)
+{
+ struct hvm_virpit *vpit = &(v->domain->arch.hvm_domain.vpit);
+ u64 host_tsc;
+
+ rdtscll(host_tsc);
+
+ vpit->cache_tsc_offset = gtime - host_tsc;
+ __set_tsc_offset(vpit->cache_tsc_offset);
}
static inline void
@@ -64,6 +77,7 @@
if ( is_pit_irq(v, vector, type) ) {
if ( !vpit->first_injected ) {
vpit->pending_intr_nr = 0;
+ vpit->last_pit_gtime = get_guest_time(v);
vpit->scheduled = NOW() + vpit->period;
set_timer(&vpit->pit_timer, vpit->scheduled);
vpit->first_injected = 1;
@@ -71,7 +85,9 @@
vpit->pending_intr_nr--;
}
vpit->inject_point = NOW();
- vmx_set_tsc_shift (v, vpit);
+
+ vpit->last_pit_gtime += vpit->period;
+ set_guest_time(v, vpit->last_pit_gtime);
}
switch(type)
@@ -189,14 +205,15 @@
vmx_stts();
+ /* pick up the elapsed PIT ticks and re-enable pit_timer */
+ if ( vpit->first_injected) {
+ set_guest_time(v, v->domain->arch.hvm_domain.guest_time);
+ pickup_deactive_ticks(vpit);
+ }
+
if ( test_bit(iopacket_port(v), &d->shared_info->evtchn_pending[0]) ||
test_bit(ARCH_HVM_IO_WAIT, &v->arch.hvm_vcpu.ioflags) )
hvm_wait_io();
-
- /* pick up the elapsed PIT ticks and re-enable pit_timer */
- if ( vpit->first_injected )
- pickup_deactive_ticks(vpit);
- vmx_set_tsc_shift(v, vpit);
/* We can't resume the guest if we're waiting on I/O */
ASSERT(!test_bit(ARCH_HVM_IO_WAIT, &v->arch.hvm_vcpu.ioflags));
diff -r f163677f8767 -r a9f5cf43451f xen/arch/x86/hvm/vmx/vmcs.c
--- a/xen/arch/x86/hvm/vmx/vmcs.c Tue Mar 21 16:55:44 2006
+++ b/xen/arch/x86/hvm/vmx/vmcs.c Tue Mar 21 18:19:11 2006
@@ -195,7 +195,6 @@
/* Update CR3, GDT, LDT, TR */
unsigned int error = 0;
unsigned long cr0, cr4;
- u64 host_tsc;
if (v->vcpu_id == 0)
hvm_setup_platform(v->domain);
@@ -250,9 +249,7 @@
v->arch.hvm_vmx.launch_cpu = smp_processor_id();
/* init guest tsc to start from 0 */
- rdtscll(host_tsc);
- v->arch.hvm_vmx.tsc_offset = 0 - host_tsc;
- vmx_set_tsc_shift(v, &v->domain->arch.hvm_domain.vpit);
+ set_guest_time(v, 0);
}
/*
diff -r f163677f8767 -r a9f5cf43451f xen/arch/x86/hvm/vmx/vmx.c
--- a/xen/arch/x86/hvm/vmx/vmx.c Tue Mar 21 16:55:44 2006
+++ b/xen/arch/x86/hvm/vmx/vmx.c Tue Mar 21 18:19:11 2006
@@ -50,9 +50,14 @@
static unsigned long trace_values[NR_CPUS][4];
#define TRACE_VMEXIT(index,value) trace_values[smp_processor_id()][index]=value
+static void vmx_ctxt_switch_from(struct vcpu *v);
+static void vmx_ctxt_switch_to(struct vcpu *v);
+
void vmx_final_setup_guest(struct vcpu *v)
{
- v->arch.schedule_tail = arch_vmx_do_launch;
+ v->arch.schedule_tail = arch_vmx_do_launch;
+ v->arch.ctxt_switch_from = vmx_ctxt_switch_from;
+ v->arch.ctxt_switch_to = vmx_ctxt_switch_to;
if ( v->vcpu_id == 0 )
{
@@ -105,6 +110,7 @@
}
#ifdef __x86_64__
+
static struct vmx_msr_state percpu_msr[NR_CPUS];
static u32 msr_data_index[VMX_MSR_COUNT] =
@@ -113,7 +119,7 @@
MSR_SYSCALL_MASK, MSR_EFER,
};
-void vmx_save_segments(struct vcpu *v)
+static void vmx_save_segments(struct vcpu *v)
{
rdmsrl(MSR_SHADOW_GS_BASE, v->arch.hvm_vmx.msr_content.shadow_gs);
}
@@ -124,7 +130,7 @@
* are not modified once set for generic domains, we don't save them,
* but simply reset them to the values set at percpu_traps_init().
*/
-void vmx_load_msrs(void)
+static void vmx_load_msrs(void)
{
struct vmx_msr_state *host_state = &percpu_msr[smp_processor_id()];
int i;
@@ -166,118 +172,143 @@
#define IS_CANO_ADDRESS(add) 1
static inline int long_mode_do_msr_read(struct cpu_user_regs *regs)
{
- u64 msr_content = 0;
- struct vcpu *vc = current;
- struct vmx_msr_state * msr = &vc->arch.hvm_vmx.msr_content;
- switch(regs->ecx){
+ u64 msr_content = 0;
+ struct vcpu *v = current;
+ struct vmx_msr_state *msr = &v->arch.hvm_vmx.msr_content;
+
+ switch ( regs->ecx ) {
case MSR_EFER:
+ HVM_DBG_LOG(DBG_LEVEL_2, "EFER msr_content 0x%"PRIx64, msr_content);
msr_content = msr->msr_items[VMX_INDEX_MSR_EFER];
- HVM_DBG_LOG(DBG_LEVEL_2, "EFER msr_content %"PRIx64"\n", msr_content);
- if (test_bit(VMX_CPU_STATE_LME_ENABLED,
- &vc->arch.hvm_vmx.cpu_state))
- msr_content |= 1 << _EFER_LME;
-
- if (VMX_LONG_GUEST(vc))
- msr_content |= 1 << _EFER_LMA;
- break;
+
+ /* the following code may be not needed */
+ if ( test_bit(VMX_CPU_STATE_LME_ENABLED, &v->arch.hvm_vmx.cpu_state) )
+ msr_content |= EFER_LME;
+ else
+ msr_content &= ~EFER_LME;
+
+ if ( VMX_LONG_GUEST(v) )
+ msr_content |= EFER_LMA;
+ else
+ msr_content &= ~EFER_LMA;
+ break;
+
case MSR_FS_BASE:
- if (!(VMX_LONG_GUEST(vc)))
+ if ( !(VMX_LONG_GUEST(v)) )
/* XXX should it be GP fault */
domain_crash_synchronous();
+
__vmread(GUEST_FS_BASE, &msr_content);
break;
+
case MSR_GS_BASE:
- if (!(VMX_LONG_GUEST(vc)))
+ if ( !(VMX_LONG_GUEST(v)) )
domain_crash_synchronous();
+
__vmread(GUEST_GS_BASE, &msr_content);
break;
+
case MSR_SHADOW_GS_BASE:
msr_content = msr->shadow_gs;
break;
- CASE_READ_MSR(STAR);
- CASE_READ_MSR(LSTAR);
- CASE_READ_MSR(CSTAR);
- CASE_READ_MSR(SYSCALL_MASK);
+ CASE_READ_MSR(STAR);
+ CASE_READ_MSR(LSTAR);
+ CASE_READ_MSR(CSTAR);
+ CASE_READ_MSR(SYSCALL_MASK);
+
default:
return 0;
}
- HVM_DBG_LOG(DBG_LEVEL_2, "mode_do_msr_read: msr_content: %"PRIx64"\n",
- msr_content);
+
+ HVM_DBG_LOG(DBG_LEVEL_2, "msr_content: 0x%"PRIx64, msr_content);
+
regs->eax = msr_content & 0xffffffff;
regs->edx = msr_content >> 32;
+
return 1;
}
static inline int long_mode_do_msr_write(struct cpu_user_regs *regs)
{
- u64 msr_content = regs->eax | ((u64)regs->edx << 32);
- struct vcpu *vc = current;
- struct vmx_msr_state * msr = &vc->arch.hvm_vmx.msr_content;
- struct vmx_msr_state * host_state =
- &percpu_msr[smp_processor_id()];
-
- HVM_DBG_LOG(DBG_LEVEL_1, " mode_do_msr_write msr %lx "
- "msr_content %"PRIx64"\n",
+ u64 msr_content = regs->eax | ((u64)regs->edx << 32);
+ struct vcpu *v = current;
+ struct vmx_msr_state *msr = &v->arch.hvm_vmx.msr_content;
+ struct vmx_msr_state *host_state = &percpu_msr[smp_processor_id()];
+
+ HVM_DBG_LOG(DBG_LEVEL_1, "msr 0x%lx msr_content 0x%"PRIx64"\n",
(unsigned long)regs->ecx, msr_content);
- switch (regs->ecx){
+ switch ( regs->ecx ) {
case MSR_EFER:
/* offending reserved bit will cause #GP */
- if ( msr_content &
- ~( EFER_LME | EFER_LMA | EFER_NX | EFER_SCE ) )
- vmx_inject_exception(vc, TRAP_gp_fault, 0);
-
- if ((msr_content & EFER_LME) ^
- test_bit(VMX_CPU_STATE_LME_ENABLED,
- &vc->arch.hvm_vmx.cpu_state)){
- if ( vmx_paging_enabled(vc) ||
+ if ( msr_content & ~(EFER_LME | EFER_LMA | EFER_NX | EFER_SCE) )
+ {
+ printk("trying to set reserved bit in EFER\n");
+ vmx_inject_exception(v, TRAP_gp_fault, 0);
+ return 0;
+ }
+
+ /* LME: 0 -> 1 */
+ if ( msr_content & EFER_LME &&
+ !test_bit(VMX_CPU_STATE_LME_ENABLED, &v->arch.hvm_vmx.cpu_state) )
+ {
+ if ( vmx_paging_enabled(v) ||
!test_bit(VMX_CPU_STATE_PAE_ENABLED,
- &vc->arch.hvm_vmx.cpu_state)) {
- vmx_inject_exception(vc, TRAP_gp_fault, 0);
+ &v->arch.hvm_vmx.cpu_state) )
+ {
+ printk("trying to set LME bit when "
+ "in paging mode or PAE bit is not set\n");
+ vmx_inject_exception(v, TRAP_gp_fault, 0);
+ return 0;
}
- }
- if (msr_content & EFER_LME)
- set_bit(VMX_CPU_STATE_LME_ENABLED,
- &vc->arch.hvm_vmx.cpu_state);
-
- msr->msr_items[VMX_INDEX_MSR_EFER] =
- msr_content;
+
+ set_bit(VMX_CPU_STATE_LME_ENABLED, &v->arch.hvm_vmx.cpu_state);
+ }
+
+ msr->msr_items[VMX_INDEX_MSR_EFER] = msr_content;
break;
case MSR_FS_BASE:
case MSR_GS_BASE:
- if (!(VMX_LONG_GUEST(vc)))
+ if ( !(VMX_LONG_GUEST(v)) )
domain_crash_synchronous();
- if (!IS_CANO_ADDRESS(msr_content)){
+
+ if ( !IS_CANO_ADDRESS(msr_content) )
+ {
HVM_DBG_LOG(DBG_LEVEL_1, "Not cano address of msr write\n");
- vmx_inject_exception(vc, TRAP_gp_fault, 0);
- }
- if (regs->ecx == MSR_FS_BASE)
+ vmx_inject_exception(v, TRAP_gp_fault, 0);
+ return 0;
+ }
+
+ if ( regs->ecx == MSR_FS_BASE )
__vmwrite(GUEST_FS_BASE, msr_content);
else
__vmwrite(GUEST_GS_BASE, msr_content);
+
break;
case MSR_SHADOW_GS_BASE:
- if (!(VMX_LONG_GUEST(vc)))
+ if ( !(VMX_LONG_GUEST(v)) )
domain_crash_synchronous();
- vc->arch.hvm_vmx.msr_content.shadow_gs = msr_content;
+
+ v->arch.hvm_vmx.msr_content.shadow_gs = msr_content;
wrmsrl(MSR_SHADOW_GS_BASE, msr_content);
break;
- CASE_WRITE_MSR(STAR);
- CASE_WRITE_MSR(LSTAR);
- CASE_WRITE_MSR(CSTAR);
- CASE_WRITE_MSR(SYSCALL_MASK);
+ CASE_WRITE_MSR(STAR);
+ CASE_WRITE_MSR(LSTAR);
+ CASE_WRITE_MSR(CSTAR);
+ CASE_WRITE_MSR(SYSCALL_MASK);
+
default:
return 0;
}
+
return 1;
}
-void
-vmx_restore_msrs(struct vcpu *v)
+static void vmx_restore_msrs(struct vcpu *v)
{
int i = 0;
struct vmx_msr_state *guest_state;
@@ -297,22 +328,52 @@
HVM_DBG_LOG(DBG_LEVEL_2,
"restore guest's index %d msr %lx with %lx\n",
- i, (unsigned long) msr_data_index[i], (unsigned long)
guest_state->msr_items[i]);
+ i, (unsigned long)msr_data_index[i],
+ (unsigned long)guest_state->msr_items[i]);
set_bit(i, &host_state->flags);
wrmsrl(msr_data_index[i], guest_state->msr_items[i]);
clear_bit(i, &guest_flags);
}
}
#else /* __i386__ */
-#define vmx_save_init_msrs() ((void)0)
-
-static inline int long_mode_do_msr_read(struct cpu_user_regs *regs){
+
+#define vmx_save_segments(v) ((void)0)
+#define vmx_load_msrs() ((void)0)
+#define vmx_restore_msrs(v) ((void)0)
+#define vmx_save_init_msrs() ((void)0)
+
+static inline int long_mode_do_msr_read(struct cpu_user_regs *regs)
+{
return 0;
}
-static inline int long_mode_do_msr_write(struct cpu_user_regs *regs){
+
+static inline int long_mode_do_msr_write(struct cpu_user_regs *regs)
+{
return 0;
}
-#endif
+
+#endif /* __i386__ */
+
+static void vmx_freeze_time(struct vcpu *v)
+{
+ struct hvm_virpit *vpit = &v->domain->arch.hvm_domain.vpit;
+
+ v->domain->arch.hvm_domain.guest_time = get_guest_time(v);
+ if ( vpit->first_injected )
+ stop_timer(&(vpit->pit_timer));
+}
+
+static void vmx_ctxt_switch_from(struct vcpu *v)
+{
+ vmx_freeze_time(v);
+ vmx_save_segments(v);
+ vmx_load_msrs();
+}
+
+static void vmx_ctxt_switch_to(struct vcpu *v)
+{
+ vmx_restore_msrs(v);
+}
void stop_vmx(void)
{
@@ -553,12 +614,6 @@
hvm_funcs.store_cpu_guest_regs = vmx_store_cpu_guest_regs;
hvm_funcs.load_cpu_guest_regs = vmx_load_cpu_guest_regs;
-
-#ifdef __x86_64__
- hvm_funcs.save_segments = vmx_save_segments;
- hvm_funcs.load_msrs = vmx_load_msrs;
- hvm_funcs.restore_msrs = vmx_restore_msrs;
-#endif
hvm_funcs.store_cpu_guest_ctrl_regs = vmx_store_cpu_guest_ctrl_regs;
hvm_funcs.modify_guest_state = vmx_modify_guest_state;
@@ -1662,7 +1717,7 @@
rdtscll(msr_content);
vpit = &(v->domain->arch.hvm_domain.vpit);
- msr_content += vpit->shift;
+ msr_content += vpit->cache_tsc_offset;
break;
}
case MSR_IA32_SYSENTER_CS:
@@ -1706,22 +1761,8 @@
switch (regs->ecx) {
case MSR_IA32_TIME_STAMP_COUNTER:
- {
- struct hvm_virpit *vpit;
- u64 host_tsc, drift;
-
- rdtscll(host_tsc);
- vpit = &(v->domain->arch.hvm_domain.vpit);
- drift = v->arch.hvm_vmx.tsc_offset - vpit->shift;
- vpit->shift = msr_content - host_tsc;
- v->arch.hvm_vmx.tsc_offset = vpit->shift + drift;
- __vmwrite(TSC_OFFSET, vpit->shift);
-
-#if defined (__i386__)
- __vmwrite(TSC_OFFSET_HIGH, ((vpit->shift)>>32));
-#endif
- break;
- }
+ set_guest_time(v, msr_content);
+ break;
case MSR_IA32_SYSENTER_CS:
__vmwrite(GUEST_SYSENTER_CS, msr_content);
break;
diff -r f163677f8767 -r a9f5cf43451f xen/arch/x86/smp.c
--- a/xen/arch/x86/smp.c Tue Mar 21 16:55:44 2006
+++ b/xen/arch/x86/smp.c Tue Mar 21 18:19:11 2006
@@ -266,7 +266,7 @@
}
/*
- * Structure and data for smp_call_function().
+ * Structure and data for smp_call_function()/on_selected_cpus().
*/
struct call_data_struct {
@@ -275,41 +275,48 @@
int wait;
atomic_t started;
atomic_t finished;
+ cpumask_t selected;
};
-static spinlock_t call_lock = SPIN_LOCK_UNLOCKED;
+static DEFINE_SPINLOCK(call_lock);
static struct call_data_struct *call_data;
-/*
- * Run a function on all other CPUs.
- * @func: The function to run. This must be fast and non-blocking.
- * @info: An arbitrary pointer to pass to the function.
- * @wait: If true, spin until function has completed on other CPUs.
- * Returns: 0 on success, else a negative status code.
- */
int smp_call_function(
- void (*func) (void *info), void *info, int unused, int wait)
+ void (*func) (void *info),
+ void *info,
+ int retry,
+ int wait)
+{
+ cpumask_t allbutself = cpu_online_map;
+ cpu_clear(smp_processor_id(), allbutself);
+ return on_selected_cpus(allbutself, func, info, retry, wait);
+}
+
+extern int on_selected_cpus(
+ cpumask_t selected,
+ void (*func) (void *info),
+ void *info,
+ int retry,
+ int wait)
{
struct call_data_struct data;
- unsigned int nr_cpus = num_online_cpus() - 1;
+ unsigned int nr_cpus = cpus_weight(selected);
ASSERT(local_irq_is_enabled());
-
- if ( nr_cpus == 0 )
- return 0;
data.func = func;
data.info = info;
data.wait = wait;
atomic_set(&data.started, 0);
atomic_set(&data.finished, 0);
+ data.selected = selected;
spin_lock(&call_lock);
call_data = &data;
wmb();
- send_IPI_allbutself(CALL_FUNCTION_VECTOR);
+ send_IPI_mask(selected, CALL_FUNCTION_VECTOR);
while ( atomic_read(wait ? &data.finished : &data.started) != nr_cpus )
cpu_relax();
@@ -353,6 +360,9 @@
ack_APIC_irq();
perfc_incrc(ipis);
+ if ( !cpu_isset(smp_processor_id(), call_data->selected) )
+ return;
+
if ( call_data->wait )
{
(*func)(info);
diff -r f163677f8767 -r a9f5cf43451f xen/common/Makefile
--- a/xen/common/Makefile Tue Mar 21 16:55:44 2006
+++ b/xen/common/Makefile Tue Mar 21 18:19:11 2006
@@ -1,19 +1,34 @@
-
include $(BASEDIR)/Rules.mk
-ifneq ($(perfc),y)
-OBJS := $(subst perfc.o,,$(OBJS))
-endif
-ifneq ($(crash_debug),y)
-OBJS := $(patsubst gdbstub.o,,$(OBJS))
-endif
+obj-y += acm_ops.o
+obj-y += bitmap.o
+obj-y += dom0_ops.o
+obj-y += domain.o
+obj-y += elf.o
+obj-y += event_channel.o
+obj-y += grant_table.o
+obj-y += kernel.o
+obj-y += keyhandler.o
+obj-y += lib.o
+obj-y += memory.o
+obj-y += multicall.o
+obj-y += page_alloc.o
+obj-y += rangeset.o
+obj-y += sched_bvt.o
+obj-y += sched_sedf.o
+obj-y += schedule.o
+obj-y += softirq.o
+obj-y += string.o
+obj-y += symbols.o
+obj-y += trace.o
+obj-y += timer.o
+obj-y += vsprintf.o
+obj-y += xmalloc.o
-default: common.o
-common.o: $(OBJS)
- $(LD) $(LDFLAGS) -r -o common.o $(OBJS)
+obj-$(perfc) += perfc.o
+obj-$(crash_debug) += gdbstub.o
-clean:
- rm -f *.o *~ core
+include $(BASEDIR)/Post.mk
# Object file contains changeset and compiler information.
kernel.o: $(BASEDIR)/include/xen/compile.h
diff -r f163677f8767 -r a9f5cf43451f xen/drivers/Makefile
--- a/xen/drivers/Makefile Tue Mar 21 16:55:44 2006
+++ b/xen/drivers/Makefile Tue Mar 21 18:19:11 2006
@@ -1,8 +1,6 @@
+include $(BASEDIR)/Rules.mk
-default:
- $(MAKE) -C char
- $(MAKE) -C acpi
+subdir-y += char
+subdir-$(HAS_ACPI) += acpi
-clean:
- $(MAKE) -C char clean
- $(MAKE) -C acpi clean
+include $(BASEDIR)/Post.mk
diff -r f163677f8767 -r a9f5cf43451f xen/drivers/acpi/Makefile
--- a/xen/drivers/acpi/Makefile Tue Mar 21 16:55:44 2006
+++ b/xen/drivers/acpi/Makefile Tue Mar 21 18:19:11 2006
@@ -1,11 +1,5 @@
-
include $(BASEDIR)/Rules.mk
-OBJS := tables.o
+obj-y += tables.o
-default: driver.o
-driver.o: $(OBJS)
- $(LD) $(LDFLAGS) -r -o driver.o $(OBJS)
-
-clean:
- rm -f *.o *~ core
+include $(BASEDIR)/Post.mk
diff -r f163677f8767 -r a9f5cf43451f xen/drivers/char/Makefile
--- a/xen/drivers/char/Makefile Tue Mar 21 16:55:44 2006
+++ b/xen/drivers/char/Makefile Tue Mar 21 18:19:11 2006
@@ -1,12 +1,10 @@
-
include $(BASEDIR)/Rules.mk
-default: driver.o
-driver.o: $(OBJS)
- $(LD) $(LDFLAGS) -r -o driver.o $(OBJS)
+obj-y += console.o
+obj-y += ns16550.o
+obj-y += serial.o
-clean:
- rm -f *.o *~ core
+include $(BASEDIR)/Post.mk
# Object file contains changeset and compiler information.
console.o: $(BASEDIR)/include/xen/compile.h
diff -r f163677f8767 -r a9f5cf43451f xen/include/asm-ia64/linux/asm/irq.h
--- a/xen/include/asm-ia64/linux/asm/irq.h Tue Mar 21 16:55:44 2006
+++ b/xen/include/asm-ia64/linux/asm/irq.h Tue Mar 21 18:19:11 2006
@@ -40,4 +40,6 @@
struct pt_regs;
int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *);
+extern fastcall unsigned int __do_IRQ(unsigned int irq, struct pt_regs *regs);
+
#endif /* _ASM_IA64_IRQ_H */
diff -r f163677f8767 -r a9f5cf43451f xen/include/asm-x86/domain.h
--- a/xen/include/asm-x86/domain.h Tue Mar 21 16:55:44 2006
+++ b/xen/include/asm-x86/domain.h Tue Mar 21 18:19:11 2006
@@ -124,6 +124,9 @@
void (*schedule_tail) (struct vcpu *);
+ void (*ctxt_switch_from) (struct vcpu *);
+ void (*ctxt_switch_to) (struct vcpu *);
+
/* Bounce information for propagating an exception to guest OS. */
struct trap_bounce trap_bounce;
diff -r f163677f8767 -r a9f5cf43451f xen/include/asm-x86/genapic.h
--- a/xen/include/asm-x86/genapic.h Tue Mar 21 16:55:44 2006
+++ b/xen/include/asm-x86/genapic.h Tue Mar 21 18:19:11 2006
@@ -34,23 +34,13 @@
physid_mask_t (*ioapic_phys_id_map)(physid_mask_t map);
void (*clustered_apic_check)(void);
- int (*multi_timer_check)(int apic, int irq);
int (*apicid_to_node)(int logical_apicid);
int (*cpu_to_logical_apicid)(int cpu);
int (*cpu_present_to_apicid)(int mps_cpu);
physid_mask_t (*apicid_to_cpu_present)(int phys_apicid);
- int (*mpc_apic_id)(struct mpc_config_processor *m,
- struct mpc_config_translation *t);
- void (*setup_portio_remap)(void);
int (*check_phys_apicid_present)(int boot_cpu_physical_apicid);
void (*enable_apic_mode)(void);
u32 (*phys_pkg_id)(u32 cpuid_apic, int index_msb);
-
- /* mpparse */
- void (*mpc_oem_bus_info)(struct mpc_config_bus *, char *,
- struct mpc_config_translation *);
- void (*mpc_oem_pci_bus)(struct mpc_config_bus *,
- struct mpc_config_translation *);
/* When one of the next two hooks returns 1 the genapic
is switched to this. Essentially they are additional probe
@@ -60,7 +50,6 @@
int (*acpi_madt_oem_check)(char *oem_id, char *oem_table_id);
unsigned (*get_apic_id)(unsigned long x);
- unsigned long apic_id_mask;
unsigned int (*cpu_mask_to_apicid)(cpumask_t cpumask);
/* ipi */
@@ -86,19 +75,13 @@
APICFUNC(init_apic_ldr), \
APICFUNC(ioapic_phys_id_map), \
APICFUNC(clustered_apic_check), \
- APICFUNC(multi_timer_check), \
APICFUNC(apicid_to_node), \
APICFUNC(cpu_to_logical_apicid), \
APICFUNC(cpu_present_to_apicid), \
APICFUNC(apicid_to_cpu_present), \
- APICFUNC(mpc_apic_id), \
- APICFUNC(setup_portio_remap), \
APICFUNC(check_phys_apicid_present), \
- APICFUNC(mpc_oem_bus_info), \
- APICFUNC(mpc_oem_pci_bus), \
APICFUNC(mps_oem_check), \
APICFUNC(get_apic_id), \
- .apic_id_mask = APIC_ID_MASK, \
APICFUNC(cpu_mask_to_apicid), \
APICFUNC(acpi_madt_oem_check), \
APICFUNC(send_IPI_mask), \
diff -r f163677f8767 -r a9f5cf43451f xen/include/asm-x86/hvm/domain.h
--- a/xen/include/asm-x86/hvm/domain.h Tue Mar 21 16:55:44 2006
+++ b/xen/include/asm-x86/hvm/domain.h Tue Mar 21 18:19:11 2006
@@ -37,6 +37,7 @@
unsigned int pae_enabled;
struct hvm_virpit vpit;
+ u64 guest_time;
struct hvm_virpic vpic;
struct hvm_vioapic vioapic;
struct hvm_io_handler io_handler;
diff -r f163677f8767 -r a9f5cf43451f xen/include/asm-x86/hvm/hvm.h
--- a/xen/include/asm-x86/hvm/hvm.h Tue Mar 21 16:55:44 2006
+++ b/xen/include/asm-x86/hvm/hvm.h Tue Mar 21 18:19:11 2006
@@ -41,18 +41,11 @@
/*
* Store and load guest state:
* 1) load/store guest register state,
- * 2) load/store segment state (x86_64 only),
- * 3) load/store msr register state (x86_64 only),
- * 4) store guest control register state (used for panic dumps),
- * 5) modify guest state (e.g., set debug flags).
+ * 2) store guest control register state (used for panic dumps),
+ * 3) modify guest state (e.g., set debug flags).
*/
void (*store_cpu_guest_regs)(struct vcpu *v, struct cpu_user_regs *r);
void (*load_cpu_guest_regs)(struct vcpu *v, struct cpu_user_regs *r);
-#ifdef __x86_64__
- void (*save_segments)(struct vcpu *v);
- void (*load_msrs)(void);
- void (*restore_msrs)(struct vcpu *v);
-#endif
void (*store_cpu_guest_ctrl_regs)(struct vcpu *v, unsigned long crs[8]);
void (*modify_guest_state)(struct vcpu *v);
@@ -111,33 +104,6 @@
hvm_funcs.load_cpu_guest_regs(v, r);
}
-#ifdef __x86_64__
-static inline void
-hvm_save_segments(struct vcpu *v)
-{
- if (hvm_funcs.save_segments)
- hvm_funcs.save_segments(v);
-}
-
-static inline void
-hvm_load_msrs(void)
-{
- if (hvm_funcs.load_msrs)
- hvm_funcs.load_msrs();
-}
-
-static inline void
-hvm_restore_msrs(struct vcpu *v)
-{
- if (hvm_funcs.restore_msrs)
- hvm_funcs.restore_msrs(v);
-}
-#else
-#define hvm_save_segments(v) ((void)0)
-#define hvm_load_msrs(v) ((void)0)
-#define hvm_restore_msrs(v) ((void)0)
-#endif /* __x86_64__ */
-
static inline void
hvm_store_cpu_guest_ctrl_regs(struct vcpu *v, unsigned long crs[8])
{
diff -r f163677f8767 -r a9f5cf43451f xen/include/asm-x86/hvm/vmx/vmcs.h
--- a/xen/include/asm-x86/hvm/vmx/vmcs.h Tue Mar 21 16:55:44 2006
+++ b/xen/include/asm-x86/hvm/vmx/vmcs.h Tue Mar 21 18:19:11 2006
@@ -77,7 +77,6 @@
unsigned long cpu_based_exec_control;
struct vmx_msr_state msr_content;
void *io_bitmap_a, *io_bitmap_b;
- u64 tsc_offset;
struct timer hlt_timer; /* hlt ins emulation wakeup timer */
};
diff -r f163677f8767 -r a9f5cf43451f xen/include/asm-x86/hvm/vmx/vmx.h
--- a/xen/include/asm-x86/hvm/vmx/vmx.h Tue Mar 21 16:55:44 2006
+++ b/xen/include/asm-x86/hvm/vmx/vmx.h Tue Mar 21 18:19:11 2006
@@ -30,10 +30,11 @@
extern void vmx_asm_do_resume(void);
extern void vmx_asm_do_launch(void);
extern void vmx_intr_assist(void);
-extern void vmx_set_tsc_shift(struct vcpu *, struct hvm_virpit *);
extern void vmx_migrate_timers(struct vcpu *v);
extern void arch_vmx_do_launch(struct vcpu *);
extern void arch_vmx_do_resume(struct vcpu *);
+extern void set_guest_time(struct vcpu *v, u64 gtime);
+extern u64 get_guest_time(struct vcpu *v);
extern unsigned int cpu_rev;
diff -r f163677f8767 -r a9f5cf43451f xen/include/asm-x86/hvm/vpit.h
--- a/xen/include/asm-x86/hvm/vpit.h Tue Mar 21 16:55:44 2006
+++ b/xen/include/asm-x86/hvm/vpit.h Tue Mar 21 18:19:11 2006
@@ -38,7 +38,6 @@
struct hvm_virpit {
/* for simulation of counter 0 in mode 2 */
u64 period_cycles; /* pit frequency in cpu cycles */
- u64 shift; /* save the value of offset - drift */
s_time_t inject_point; /* the time inject virt intr */
s_time_t scheduled; /* scheduled timer interrupt */
struct timer pit_timer; /* periodic timer for mode 2*/
@@ -46,6 +45,8 @@
unsigned int pending_intr_nr; /* the couner for pending timer interrupts */
u32 period; /* pit frequency in ns */
int first_injected; /* flag to prevent shadow window */
+ s64 cache_tsc_offset; /* cache of VMCS TSC_OFFSET offset */
+ u64 last_pit_gtime; /* guest time when last pit is injected */
/* virtual PIT state for handle related I/O */
int read_state;
diff -r f163677f8767 -r a9f5cf43451f xen/include/asm-x86/mach-bigsmp/mach_apic.h
--- a/xen/include/asm-x86/mach-bigsmp/mach_apic.h Tue Mar 21 16:55:44 2006
+++ b/xen/include/asm-x86/mach-bigsmp/mach_apic.h Tue Mar 21 18:19:11 2006
@@ -1,17 +1,10 @@
#ifndef __ASM_MACH_APIC_H
#define __ASM_MACH_APIC_H
-#include <asm/smp.h>
-#define SEQUENTIAL_APICID
-#ifdef SEQUENTIAL_APICID
-#define xapic_phys_to_log_apicid(phys_apic) ( (1ul << ((phys_apic) & 0x3)) |\
- ((phys_apic<<2) & (~0xf)) )
-#elif CLUSTERED_APICID
-#define xapic_phys_to_log_apicid(phys_apic) ( (1ul << ((phys_apic) & 0x3)) |\
- ((phys_apic) & (~0xf)) )
-#endif
-#define NO_BALANCE_IRQ (1)
+extern u8 bios_cpu_apicid[];
+
+#define xapic_phys_to_log_apicid(cpu) (bios_cpu_apicid[cpu])
#define esr_disable (1)
static inline int apic_id_registered(void)
@@ -19,7 +12,6 @@
return (1);
}
-#define APIC_DFR_VALUE (APIC_DFR_CLUSTER)
/* Round robin the irqs amoung the online cpus */
static inline cpumask_t target_cpus(void)
{
@@ -32,29 +24,34 @@
} while (cpu >= NR_CPUS);
return cpumask_of_cpu(cpu);
}
-#define TARGET_CPUS (target_cpus())
-#define INT_DELIVERY_MODE dest_Fixed
-#define INT_DEST_MODE 1 /* logical delivery broadcast to all procs */
+#undef APIC_DEST_LOGICAL
+#define APIC_DEST_LOGICAL 0
+#define TARGET_CPUS (target_cpus())
+#define APIC_DFR_VALUE (APIC_DFR_FLAT)
+#define INT_DELIVERY_MODE (dest_Fixed)
+#define INT_DEST_MODE (0) /* phys delivery to target proc */
+#define NO_BALANCE_IRQ (0)
+#define WAKE_SECONDARY_VIA_INIT
+
static inline unsigned long check_apicid_used(physid_mask_t bitmap, int apicid)
{
- return 0;
+ return (0);
}
-/* we don't use the phys_cpu_present_map to indicate apicid presence */
-static inline unsigned long check_apicid_present(int bit)
+static inline unsigned long check_apicid_present(int bit)
{
- return 1;
+ return (1);
}
-#define apicid_cluster(apicid) (apicid & 0xF0)
-
-static inline unsigned long calculate_ldr(unsigned long old)
+static inline unsigned long calculate_ldr(int cpu)
{
- unsigned long id;
- id = xapic_phys_to_log_apicid(hard_smp_processor_id());
- return ((old & ~APIC_LDR_MASK) | SET_APIC_LOGICAL_ID(id));
+ unsigned long val, id;
+ val = apic_read(APIC_LDR) & ~APIC_LDR_MASK;
+ id = xapic_phys_to_log_apicid(cpu);
+ val |= SET_APIC_LOGICAL_ID(id);
+ return val;
}
/*
@@ -67,37 +64,30 @@
static inline void init_apic_ldr(void)
{
unsigned long val;
+ int cpu = smp_processor_id();
apic_write_around(APIC_DFR, APIC_DFR_VALUE);
- val = apic_read(APIC_LDR) & ~APIC_LDR_MASK;
- val = calculate_ldr(val);
+ val = calculate_ldr(cpu);
apic_write_around(APIC_LDR, val);
}
static inline void clustered_apic_check(void)
{
printk("Enabling APIC mode: %s. Using %d I/O APICs\n",
- "Cluster", nr_ioapics);
-}
-
-static inline int multi_timer_check(int apic, int irq)
-{
- return 0;
+ "Physflat", nr_ioapics);
}
static inline int apicid_to_node(int logical_apicid)
{
- return 0;
+ return (0);
}
-
-extern u8 bios_cpu_apicid[];
static inline int cpu_present_to_apicid(int mps_cpu)
{
if (mps_cpu < NR_CPUS)
- return (int)bios_cpu_apicid[mps_cpu];
- else
- return BAD_APICID;
+ return (int) bios_cpu_apicid[mps_cpu];
+
+ return BAD_APICID;
}
static inline physid_mask_t apicid_to_cpu_present(int phys_apicid)
@@ -109,32 +99,15 @@
/* Mapping from cpu number to logical apicid */
static inline int cpu_to_logical_apicid(int cpu)
{
- if (cpu >= NR_CPUS)
- return BAD_APICID;
- return (int)cpu_2_logical_apicid[cpu];
- }
-
-static inline int mpc_apic_id(struct mpc_config_processor *m,
- struct mpc_config_translation *translation_record)
-{
- printk("Processor #%d %d:%d APIC version %d\n",
- m->mpc_apicid,
- (m->mpc_cpufeature & CPU_FAMILY_MASK) >> 8,
- (m->mpc_cpufeature & CPU_MODEL_MASK) >> 4,
- m->mpc_apicver);
- return m->mpc_apicid;
+ if (cpu >= NR_CPUS)
+ return BAD_APICID;
+ return cpu_physical_id(cpu);
}
static inline physid_mask_t ioapic_phys_id_map(physid_mask_t phys_map)
{
/* For clustered we don't have a good way to do this yet - hack */
- return physids_promote(0xFUL);
-}
-
-#define WAKE_SECONDARY_VIA_INIT
-
-static inline void setup_portio_remap(void)
-{
+ return physids_promote(0xFFL);
}
static inline void enable_apic_mode(void)
diff -r f163677f8767 -r a9f5cf43451f
xen/include/asm-x86/mach-bigsmp/mach_apicdef.h
--- a/xen/include/asm-x86/mach-bigsmp/mach_apicdef.h Tue Mar 21 16:55:44 2006
+++ b/xen/include/asm-x86/mach-bigsmp/mach_apicdef.h Tue Mar 21 18:19:11 2006
@@ -1,11 +1,9 @@
#ifndef __ASM_MACH_APICDEF_H
#define __ASM_MACH_APICDEF_H
-#define APIC_ID_MASK (0x0F<<24)
-
static inline unsigned get_apic_id(unsigned long x)
{
- return (((x)>>24)&0x0F);
+ return (((x)>>24)&0xFF);
}
#define GET_APIC_ID(x) get_apic_id(x)
diff -r f163677f8767 -r a9f5cf43451f
xen/include/asm-x86/mach-default/mach_apic.h
--- a/xen/include/asm-x86/mach-default/mach_apic.h Tue Mar 21 16:55:44 2006
+++ b/xen/include/asm-x86/mach-default/mach_apic.h Tue Mar 21 18:19:11 2006
@@ -60,11 +60,6 @@
"Flat", nr_ioapics);
}
-static inline int multi_timer_check(int apic, int irq)
-{
- return 0;
-}
-
static inline int apicid_to_node(int logical_apicid)
{
return 0;
@@ -87,21 +82,6 @@
static inline physid_mask_t apicid_to_cpu_present(int phys_apicid)
{
return physid_mask_of_physid(phys_apicid);
-}
-
-static inline int mpc_apic_id(struct mpc_config_processor *m,
- struct mpc_config_translation *translation_record)
-{
- printk("Processor #%d %d:%d APIC version %d\n",
- m->mpc_apicid,
- (m->mpc_cpufeature & CPU_FAMILY_MASK) >> 8,
- (m->mpc_cpufeature & CPU_MODEL_MASK) >> 4,
- m->mpc_apicver);
- return (m->mpc_apicid);
-}
-
-static inline void setup_portio_remap(void)
-{
}
static inline int check_phys_apicid_present(int boot_cpu_physical_apicid)
diff -r f163677f8767 -r a9f5cf43451f
xen/include/asm-x86/mach-default/mach_apicdef.h
--- a/xen/include/asm-x86/mach-default/mach_apicdef.h Tue Mar 21 16:55:44 2006
+++ b/xen/include/asm-x86/mach-default/mach_apicdef.h Tue Mar 21 18:19:11 2006
@@ -1,7 +1,5 @@
#ifndef __ASM_MACH_APICDEF_H
#define __ASM_MACH_APICDEF_H
-
-#define APIC_ID_MASK (0xF<<24)
static inline unsigned get_apic_id(unsigned long x)
{
diff -r f163677f8767 -r a9f5cf43451f xen/include/asm-x86/mach-default/mach_ipi.h
--- a/xen/include/asm-x86/mach-default/mach_ipi.h Tue Mar 21 16:55:44 2006
+++ b/xen/include/asm-x86/mach-default/mach_ipi.h Tue Mar 21 18:19:11 2006
@@ -4,9 +4,30 @@
void send_IPI_mask_bitmask(cpumask_t mask, int vector);
void __send_IPI_shortcut(unsigned int shortcut, int vector);
+extern int no_broadcast;
+
static inline void send_IPI_mask(cpumask_t mask, int vector)
{
send_IPI_mask_bitmask(mask, vector);
+}
+
+static inline void __local_send_IPI_allbutself(int vector)
+{
+ if (no_broadcast) {
+ cpumask_t mask = cpu_online_map;
+
+ cpu_clear(smp_processor_id(), mask);
+ send_IPI_mask(mask, vector);
+ } else
+ __send_IPI_shortcut(APIC_DEST_ALLBUT, vector);
+}
+
+static inline void __local_send_IPI_all(int vector)
+{
+ if (no_broadcast)
+ send_IPI_mask(cpu_online_map, vector);
+ else
+ __send_IPI_shortcut(APIC_DEST_ALLINC, vector);
}
static inline void send_IPI_allbutself(int vector)
@@ -18,13 +39,13 @@
if (!(num_online_cpus() > 1))
return;
- __send_IPI_shortcut(APIC_DEST_ALLBUT, vector);
+ __local_send_IPI_allbutself(vector);
return;
}
static inline void send_IPI_all(int vector)
{
- __send_IPI_shortcut(APIC_DEST_ALLINC, vector);
+ __local_send_IPI_all(vector);
}
#endif /* __ASM_MACH_IPI_H */
diff -r f163677f8767 -r a9f5cf43451f
xen/include/asm-x86/mach-default/mach_mpparse.h
--- a/xen/include/asm-x86/mach-default/mach_mpparse.h Tue Mar 21 16:55:44 2006
+++ b/xen/include/asm-x86/mach-default/mach_mpparse.h Tue Mar 21 18:19:11 2006
@@ -1,16 +1,5 @@
#ifndef __ASM_MACH_MPPARSE_H
#define __ASM_MACH_MPPARSE_H
-
-static inline void mpc_oem_bus_info(struct mpc_config_bus *m, char *name,
- struct mpc_config_translation *translation)
-{
-// Dprintk("Bus #%d is %s\n", m->mpc_busid, name);
-}
-
-static inline void mpc_oem_pci_bus(struct mpc_config_bus *m,
- struct mpc_config_translation *translation)
-{
-}
static inline int mps_oem_check(struct mp_config_table *mpc, char *oem,
char *productid)
diff -r f163677f8767 -r a9f5cf43451f xen/include/asm-x86/mach-es7000/mach_apic.h
--- a/xen/include/asm-x86/mach-es7000/mach_apic.h Tue Mar 21 16:55:44 2006
+++ b/xen/include/asm-x86/mach-es7000/mach_apic.h Tue Mar 21 18:19:11 2006
@@ -89,11 +89,6 @@
"Physical Cluster" : "Logical Cluster", nr_ioapics,
cpus_addr(TARGET_CPUS)[0]);
}
-static inline int multi_timer_check(int apic, int irq)
-{
- return 0;
-}
-
static inline int apicid_to_node(int logical_apicid)
{
return 0;
@@ -128,25 +123,10 @@
return (int)cpu_2_logical_apicid[cpu];
}
-static inline int mpc_apic_id(struct mpc_config_processor *m, struct
mpc_config_translation *unused)
-{
- printk("Processor #%d %d:%d APIC version %d\n",
- m->mpc_apicid,
- (m->mpc_cpufeature & CPU_FAMILY_MASK) >> 8,
- (m->mpc_cpufeature & CPU_MODEL_MASK) >> 4,
- m->mpc_apicver);
- return (m->mpc_apicid);
-}
-
static inline physid_mask_t ioapic_phys_id_map(physid_mask_t phys_map)
{
/* For clustered we don't have a good way to do this yet - hack */
return physids_promote(0xff);
-}
-
-
-static inline void setup_portio_remap(void)
-{
}
extern unsigned int boot_cpu_physical_apicid;
diff -r f163677f8767 -r a9f5cf43451f
xen/include/asm-x86/mach-es7000/mach_apicdef.h
--- a/xen/include/asm-x86/mach-es7000/mach_apicdef.h Tue Mar 21 16:55:44 2006
+++ b/xen/include/asm-x86/mach-es7000/mach_apicdef.h Tue Mar 21 18:19:11 2006
@@ -1,7 +1,5 @@
#ifndef __ASM_MACH_APICDEF_H
#define __ASM_MACH_APICDEF_H
-
-#define APIC_ID_MASK (0xFF<<24)
static inline unsigned get_apic_id(unsigned long x)
{
diff -r f163677f8767 -r a9f5cf43451f
xen/include/asm-x86/mach-es7000/mach_mpparse.h
--- a/xen/include/asm-x86/mach-es7000/mach_mpparse.h Tue Mar 21 16:55:44 2006
+++ b/xen/include/asm-x86/mach-es7000/mach_mpparse.h Tue Mar 21 18:19:11 2006
@@ -1,19 +1,11 @@
#ifndef __ASM_MACH_MPPARSE_H
#define __ASM_MACH_MPPARSE_H
-static inline void mpc_oem_bus_info(struct mpc_config_bus *m, char *name,
- struct mpc_config_translation *translation)
-{
- Dprintk("Bus #%d is %s\n", m->mpc_busid, name);
-}
+#include <xen/acpi.h>
-static inline void mpc_oem_pci_bus(struct mpc_config_bus *m,
- struct mpc_config_translation *translation)
-{
-}
-
-extern int parse_unisys_oem (char *oemptr, int oem_entries);
-extern int find_unisys_acpi_oem_table(unsigned long *oem_addr, int *length);
+extern int parse_unisys_oem (char *oemptr);
+extern int find_unisys_acpi_oem_table(unsigned long *oem_addr);
+extern void setup_unisys(void);
static inline int mps_oem_check(struct mp_config_table *mpc, char *oem,
char *productid)
@@ -22,8 +14,18 @@
struct mp_config_oemtable *oem_table =
(struct mp_config_oemtable *)(long)mpc->mpc_oemptr;
if (!strncmp(oem, "UNISYS", 6))
- return parse_unisys_oem((char *)oem_table,
oem_table->oem_length);
+ return parse_unisys_oem((char *)oem_table);
}
+ return 0;
+}
+
+static inline int es7000_check_dsdt(void)
+{
+ struct acpi_table_header *header = NULL;
+ if(!acpi_get_table_header_early(ACPI_DSDT, &header))
+ acpi_table_print(header, 0);
+ if (!strncmp(header->oem_id, "UNISYS", 6))
+ return 1;
return 0;
}
@@ -31,9 +33,14 @@
static inline int acpi_madt_oem_check(char *oem_id, char *oem_table_id)
{
unsigned long oem_addr;
- int oem_entries;
- if (!find_unisys_acpi_oem_table(&oem_addr, &oem_entries))
- return parse_unisys_oem((char *)oem_addr, oem_entries);
+ if (!find_unisys_acpi_oem_table(&oem_addr)) {
+ if (es7000_check_dsdt())
+ return parse_unisys_oem((char *)oem_addr);
+ else {
+ setup_unisys();
+ return 1;
+ }
+ }
return 0;
}
diff -r f163677f8767 -r a9f5cf43451f
xen/include/asm-x86/mach-generic/mach_apic.h
--- a/xen/include/asm-x86/mach-generic/mach_apic.h Tue Mar 21 16:55:44 2006
+++ b/xen/include/asm-x86/mach-generic/mach_apic.h Tue Mar 21 18:19:11 2006
@@ -14,13 +14,10 @@
#define init_apic_ldr (genapic->init_apic_ldr)
#define ioapic_phys_id_map (genapic->ioapic_phys_id_map)
#define clustered_apic_check (genapic->clustered_apic_check)
-#define multi_timer_check (genapic->multi_timer_check)
#define apicid_to_node (genapic->apicid_to_node)
#define cpu_to_logical_apicid (genapic->cpu_to_logical_apicid)
#define cpu_present_to_apicid (genapic->cpu_present_to_apicid)
#define apicid_to_cpu_present (genapic->apicid_to_cpu_present)
-#define mpc_apic_id (genapic->mpc_apic_id)
-#define setup_portio_remap (genapic->setup_portio_remap)
#define check_apicid_present (genapic->check_apicid_present)
#define check_phys_apicid_present (genapic->check_phys_apicid_present)
#define check_apicid_used (genapic->check_apicid_used)
@@ -28,6 +25,26 @@
#define enable_apic_mode (genapic->enable_apic_mode)
#define phys_pkg_id (genapic->phys_pkg_id)
+static inline int mpc_apic_id(struct mpc_config_processor *m,
+ struct mpc_config_translation *translation_record)
+{
+ printk("Processor #%d %d:%d APIC version %d\n",
+ m->mpc_apicid,
+ (m->mpc_cpufeature & CPU_FAMILY_MASK) >> 8,
+ (m->mpc_cpufeature & CPU_MODEL_MASK) >> 4,
+ m->mpc_apicver);
+ return (m->mpc_apicid);
+}
+
+static inline void setup_portio_remap(void)
+{
+}
+
+static inline int multi_timer_check(int apic, int irq)
+{
+ return 0;
+}
+
extern void generic_bigsmp_probe(void);
#endif /* __ASM_MACH_APIC_H */
diff -r f163677f8767 -r a9f5cf43451f
xen/include/asm-x86/mach-generic/mach_apicdef.h
--- a/xen/include/asm-x86/mach-generic/mach_apicdef.h Tue Mar 21 16:55:44 2006
+++ b/xen/include/asm-x86/mach-generic/mach_apicdef.h Tue Mar 21 18:19:11 2006
@@ -5,7 +5,6 @@
#include <asm/genapic.h>
#define GET_APIC_ID (genapic->get_apic_id)
-#define APIC_ID_MASK (genapic->apic_id_mask)
#endif
#endif
diff -r f163677f8767 -r a9f5cf43451f
xen/include/asm-x86/mach-generic/mach_mpparse.h
--- a/xen/include/asm-x86/mach-generic/mach_mpparse.h Tue Mar 21 16:55:44 2006
+++ b/xen/include/asm-x86/mach-generic/mach_mpparse.h Tue Mar 21 18:19:11 2006
@@ -1,10 +1,16 @@
#ifndef _MACH_MPPARSE_H
#define _MACH_MPPARSE_H 1
-#include <asm/genapic.h>
+static inline void mpc_oem_bus_info(struct mpc_config_bus *m, char *name,
+ struct mpc_config_translation *translation)
+{
+ Dprintk("Bus #%d is %s\n", m->mpc_busid, name);
+}
-#define mpc_oem_bus_info (genapic->mpc_oem_bus_info)
-#define mpc_oem_pci_bus (genapic->mpc_oem_pci_bus)
+static inline void mpc_oem_pci_bus(struct mpc_config_bus *m,
+ struct mpc_config_translation *translation)
+{
+}
int mps_oem_check(struct mp_config_table *mpc, char *oem, char *productid);
int acpi_madt_oem_check(char *oem_id, char *oem_table_id);
diff -r f163677f8767 -r a9f5cf43451f xen/include/asm-x86/mach-summit/mach_apic.h
--- a/xen/include/asm-x86/mach-summit/mach_apic.h Tue Mar 21 16:55:44 2006
+++ b/xen/include/asm-x86/mach-summit/mach_apic.h Tue Mar 21 18:19:11 2006
@@ -68,11 +68,6 @@
apic_write_around(APIC_LDR, val);
}
-static inline int multi_timer_check(int apic, int irq)
-{
- return 0;
-}
-
static inline int apic_id_registered(void)
{
return 1;
@@ -114,21 +109,6 @@
static inline physid_mask_t apicid_to_cpu_present(int apicid)
{
return physid_mask_of_physid(0);
-}
-
-static inline int mpc_apic_id(struct mpc_config_processor *m,
- struct mpc_config_translation *translation_record)
-{
- printk("Processor #%d %d:%d APIC version %d\n",
- m->mpc_apicid,
- (m->mpc_cpufeature & CPU_FAMILY_MASK) >> 8,
- (m->mpc_cpufeature & CPU_MODEL_MASK) >> 4,
- m->mpc_apicver);
- return (m->mpc_apicid);
-}
-
-static inline void setup_portio_remap(void)
-{
}
static inline int check_phys_apicid_present(int boot_cpu_physical_apicid)
diff -r f163677f8767 -r a9f5cf43451f
xen/include/asm-x86/mach-summit/mach_apicdef.h
--- a/xen/include/asm-x86/mach-summit/mach_apicdef.h Tue Mar 21 16:55:44 2006
+++ b/xen/include/asm-x86/mach-summit/mach_apicdef.h Tue Mar 21 18:19:11 2006
@@ -1,7 +1,5 @@
#ifndef __ASM_MACH_APICDEF_H
#define __ASM_MACH_APICDEF_H
-
-#define APIC_ID_MASK (0xFF<<24)
static inline unsigned get_apic_id(unsigned long x)
{
diff -r f163677f8767 -r a9f5cf43451f
xen/include/asm-x86/mach-summit/mach_mpparse.h
--- a/xen/include/asm-x86/mach-summit/mach_mpparse.h Tue Mar 21 16:55:44 2006
+++ b/xen/include/asm-x86/mach-summit/mach_mpparse.h Tue Mar 21 18:19:11 2006
@@ -10,17 +10,6 @@
#else
#define setup_summit() {}
#endif
-
-static inline void mpc_oem_bus_info(struct mpc_config_bus *m, char *name,
- struct mpc_config_translation *translation)
-{
- Dprintk("Bus #%d is %s\n", m->mpc_busid, name);
-}
-
-static inline void mpc_oem_pci_bus(struct mpc_config_bus *m,
- struct mpc_config_translation *translation)
-{
-}
extern int usb_early_handoff;
static inline int mps_oem_check(struct mp_config_table *mpc, char *oem,
diff -r f163677f8767 -r a9f5cf43451f xen/include/xen/irq.h
--- a/xen/include/xen/irq.h Tue Mar 21 16:55:44 2006
+++ b/xen/include/xen/irq.h Tue Mar 21 18:19:11 2006
@@ -71,6 +71,5 @@
extern int pirq_guest_unmask(struct domain *p);
extern int pirq_guest_bind(struct vcpu *p, int irq, int will_share);
extern int pirq_guest_unbind(struct domain *p, int irq);
-extern fastcall unsigned int __do_IRQ(unsigned int irq, struct pt_regs *regs);
#endif /* __XEN_IRQ_H__ */
diff -r f163677f8767 -r a9f5cf43451f xen/include/xen/smp.h
--- a/xen/include/xen/smp.h Tue Mar 21 16:55:44 2006
+++ b/xen/include/xen/smp.h Tue Mar 21 18:19:11 2006
@@ -45,32 +45,34 @@
* Call a function on all other processors
*/
extern int smp_call_function(
- void (*func) (void *info), void *info, int retry, int wait);
+ void (*func) (void *info),
+ void *info,
+ int retry,
+ int wait);
+
+/*
+ * Call a function on a selection of processors
+ */
+extern int on_selected_cpus(
+ cpumask_t selected,
+ void (*func) (void *info),
+ void *info,
+ int retry,
+ int wait);
/*
* Call a function on all processors
*/
-static inline int on_each_cpu(void (*func) (void *info), void *info,
- int retry, int wait)
+static inline int on_each_cpu(
+ void (*func) (void *info),
+ void *info,
+ int retry,
+ int wait)
{
int ret = smp_call_function(func, info, retry, wait);
func(info);
return ret;
}
-
-extern volatile unsigned long smp_msg_data;
-extern volatile int smp_src_cpu;
-extern volatile int smp_msg_id;
-
-#define MSG_ALL_BUT_SELF 0x8000 /* Assume <32768 CPU's */
-#define MSG_ALL 0x8001
-
-#define MSG_INVALIDATE_TLB 0x0001 /* Remote processor TLB invalidate */
-#define MSG_STOP_CPU 0x0002 /* Sent to shut down slave CPU's
- * when rebooting
- */
-#define MSG_RESCHEDULE 0x0003 /* Reschedule request from master CPU*/
-#define MSG_CALL_FUNCTION 0x0004 /* Call function on all other CPUs */
/*
* Mark the boot cpu "online" so that it can call console drivers in
@@ -93,6 +95,18 @@
#define num_booting_cpus() 1
#define smp_prepare_boot_cpu() do {} while (0)
+static inline int on_selected_cpus(
+ cpumask_t selected,
+ void (*func) (void *info),
+ void *info,
+ int retry,
+ int wait)
+{
+ if ( cpu_isset(0, selected) )
+ func(info);
+ return 0;
+}
+
#endif
#define smp_processor_id() raw_smp_processor_id()
diff -r f163677f8767 -r a9f5cf43451f
linux-2.6-xen-sparse/drivers/xen/core/hypervisor_sysfs.c
--- /dev/null Tue Mar 21 16:55:44 2006
+++ b/linux-2.6-xen-sparse/drivers/xen/core/hypervisor_sysfs.c Tue Mar 21
18:19:11 2006
@@ -0,0 +1,57 @@
+/*
+ * copyright (c) 2006 IBM Corporation
+ * Authored by: Mike D. Day <ncmike@xxxxxxxxxx>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/config.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/kobject.h>
+#include <xen/hypervisor_sysfs.h>
+
+decl_subsys(hypervisor, NULL, NULL);
+
+static ssize_t hyp_sysfs_show(struct kobject *kobj,
+ struct attribute *attr,
+ char *buffer)
+{
+ struct hyp_sysfs_attr *hyp_attr;
+ hyp_attr = container_of(attr, struct hyp_sysfs_attr, attr);
+ if (hyp_attr->show)
+ return hyp_attr->show(hyp_attr, buffer);
+ return 0;
+}
+
+static ssize_t hyp_sysfs_store(struct kobject *kobj,
+ struct attribute *attr,
+ const char *buffer,
+ size_t len)
+{
+ struct hyp_sysfs_attr *hyp_attr;
+ hyp_attr = container_of(attr, struct hyp_sysfs_attr, attr);
+ if (hyp_attr->store)
+ return hyp_attr->store(hyp_attr, buffer, len);
+ return 0;
+}
+
+struct sysfs_ops hyp_sysfs_ops = {
+ .show = hyp_sysfs_show,
+ .store = hyp_sysfs_store,
+};
+
+static struct kobj_type hyp_sysfs_kobj_type = {
+ .sysfs_ops = &hyp_sysfs_ops,
+};
+
+static int __init hypervisor_subsys_init(void)
+{
+ hypervisor_subsys.kset.kobj.ktype = &hyp_sysfs_kobj_type;
+ return subsystem_register(&hypervisor_subsys);
+}
+
+device_initcall(hypervisor_subsys_init);
+EXPORT_SYMBOL_GPL(hypervisor_subsys);
diff -r f163677f8767 -r a9f5cf43451f
linux-2.6-xen-sparse/drivers/xen/core/xen_sysfs.c
--- /dev/null Tue Mar 21 16:55:44 2006
+++ b/linux-2.6-xen-sparse/drivers/xen/core/xen_sysfs.c Tue Mar 21 18:19:11 2006
@@ -0,0 +1,310 @@
+/*
+ * copyright (c) 2006 IBM Corporation
+ * Authored by: Mike D. Day <ncmike@xxxxxxxxxx>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/config.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <asm/hypervisor.h>
+#include <xen/hypervisor_sysfs.h>
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Mike D. Day <ncmike@xxxxxxxxxx>");
+
+static ssize_t type_show(struct hyp_sysfs_attr *attr, char *buffer)
+{
+ return sprintf(buffer, "xen\n");
+}
+
+HYPERVISOR_ATTR_RO(type);
+
+static int __init xen_sysfs_type_init(void)
+{
+ return sysfs_create_file(&hypervisor_subsys.kset.kobj, &type_attr.attr);
+}
+
+static void xen_sysfs_type_destroy(void)
+{
+ sysfs_remove_file(&hypervisor_subsys.kset.kobj, &type_attr.attr);
+}
+
+/* xen version attributes */
+static ssize_t major_show(struct hyp_sysfs_attr *attr, char *buffer)
+{
+ int version = HYPERVISOR_xen_version(XENVER_version, NULL);
+ if (version)
+ return sprintf(buffer, "%d\n", version >> 16);
+ return -ENODEV;
+}
+
+HYPERVISOR_ATTR_RO(major);
+
+static ssize_t minor_show(struct hyp_sysfs_attr *attr, char *buffer)
+{
+ int version = HYPERVISOR_xen_version(XENVER_version, NULL);
+ if (version)
+ return sprintf(buffer, "%d\n", version & 0xff);
+ return -ENODEV;
+}
+
+HYPERVISOR_ATTR_RO(minor);
+
+static ssize_t extra_show(struct hyp_sysfs_attr *attr, char *buffer)
+{
+ int ret;
+ char *extra = kmalloc(XEN_EXTRAVERSION_LEN, GFP_KERNEL);
+ if (extra) {
+ ret = HYPERVISOR_xen_version(XENVER_extraversion, extra);
+ if (!ret)
+ return sprintf(buffer, "%s\n", extra);
+ kfree(extra);
+ } else
+ ret = -ENOMEM;
+ return ret;
+}
+
+HYPERVISOR_ATTR_RO(extra);
+
+static struct attribute *version_attrs[] = {
+ &major_attr.attr,
+ &minor_attr.attr,
+ &extra_attr.attr,
+ NULL
+};
+
+static struct attribute_group version_group = {
+ .name = "version",
+ .attrs = version_attrs,
+};
+
+static int __init xen_sysfs_version_init(void)
+{
+ return sysfs_create_group(&hypervisor_subsys.kset.kobj, &version_group);
+}
+
+static void xen_sysfs_version_destroy(void)
+{
+ sysfs_remove_group(&hypervisor_subsys.kset.kobj, &version_group);
+}
+
+/* xen compilation attributes */
+
+static ssize_t compiler_show(struct hyp_sysfs_attr *attr, char *buffer)
+{
+ int ret;
+ struct xen_compile_info *info =
+ kmalloc(sizeof(struct xen_compile_info), GFP_KERNEL);
+ if (info) {
+ ret = HYPERVISOR_xen_version(XENVER_compile_info, info);
+ if (!ret)
+ ret = sprintf(buffer, "%s\n", info->compiler);
+ kfree(info);
+ } else
+ ret = -ENOMEM;
+
+ return ret;
+}
+
+HYPERVISOR_ATTR_RO(compiler);
+
+static ssize_t compiled_by_show(struct hyp_sysfs_attr *attr, char *buffer)
+{
+ int ret;
+ struct xen_compile_info *info;
+
+ info = kmalloc(sizeof(struct xen_compile_info), GFP_KERNEL);
+ if (info) {
+ ret = HYPERVISOR_xen_version(XENVER_compile_info, info);
+ if (!ret)
+ ret = sprintf(buffer, "%s\n", info->compile_by);
+ kfree(info);
+ } else
+ ret = -ENOMEM;
+ return ret;
+}
+
+HYPERVISOR_ATTR_RO(compiled_by);
+
+static ssize_t compile_date_show(struct hyp_sysfs_attr *attr, char *buffer)
+{
+ int ret;
+ struct xen_compile_info *info;
+
+ info = kmalloc(sizeof(struct xen_compile_info), GFP_KERNEL);
+ if (info) {
+ ret = HYPERVISOR_xen_version(XENVER_compile_info, info);
+ if (!ret)
+ ret = sprintf(buffer, "%s\n", info->compile_date);
+ kfree(info);
+ } else
+ ret = -ENOMEM;
+ return ret;
+}
+
+HYPERVISOR_ATTR_RO(compile_date);
+
+static struct attribute *xen_compile_attrs[] = {
+ &compiler_attr.attr,
+ &compiled_by_attr.attr,
+ &compile_date_attr.attr,
+ NULL
+};
+
+static struct attribute_group xen_compilation_group = {
+ .name = "compilation",
+ .attrs = xen_compile_attrs,
+};
+
+int __init static xen_compilation_init(void)
+{
+ return sysfs_create_group(&hypervisor_subsys.kset.kobj,
+ &xen_compilation_group);
+}
+
+static void xen_compilation_destroy(void)
+{
+ sysfs_remove_group(&hypervisor_subsys.kset.kobj,
+ &xen_compilation_group);
+}
+
+/* xen properties info */
+
+static ssize_t capabilities_show(struct hyp_sysfs_attr *attr, char *buffer)
+{
+ int ret;
+ char *caps = kmalloc(XEN_CAPABILITIES_INFO_LEN, GFP_KERNEL);
+ if (caps) {
+ ret = HYPERVISOR_xen_version(XENVER_capabilities, caps);
+ if (!ret)
+ ret = sprintf(buffer, "%s\n", caps);
+ kfree(caps);
+ } else
+ ret = -ENOMEM;
+ return ret;
+}
+
+HYPERVISOR_ATTR_RO(capabilities);
+
+static ssize_t changeset_show(struct hyp_sysfs_attr *attr, char *buffer)
+{
+ int ret;
+ char *cset = kmalloc(XEN_CHANGESET_INFO_LEN, GFP_KERNEL);
+ if (cset) {
+ ret = HYPERVISOR_xen_version(XENVER_changeset, cset);
+ if (!ret)
+ ret = sprintf(buffer, "%s\n", cset);
+ kfree(cset);
+ } else
+ ret = -ENOMEM;
+ return ret;
+}
+
+HYPERVISOR_ATTR_RO(changeset);
+
+static ssize_t virtual_start_show(struct hyp_sysfs_attr *attr, char *buffer)
+{
+ int ret;
+ struct xen_platform_parameters *parms =
+ kmalloc(sizeof(struct xen_platform_parameters), GFP_KERNEL);
+ if (parms) {
+ ret = HYPERVISOR_xen_version(XENVER_platform_parameters, parms);
+ if (!ret)
+ ret = sprintf(buffer, "%lx\n", parms->virt_start);
+ kfree(parms);
+ } else
+ ret = -ENOMEM;
+ return ret;
+}
+
+HYPERVISOR_ATTR_RO(virtual_start);
+
+/* eventually there will be several more features to export */
+static ssize_t xen_feature_show(int index, char *buffer)
+{
+ int ret;
+
+ struct xen_feature_info *info =
+ kmalloc(sizeof(struct xen_feature_info), GFP_KERNEL);
+ if (info) {
+ info->submap_idx = index;
+ ret = HYPERVISOR_xen_version(XENVER_get_features, info);
+ if (!ret)
+ ret = sprintf(buffer, "%d\n", info->submap);
+ kfree(info);
+ } else
+ ret = -ENOMEM;
+ return ret;
+}
+
+static ssize_t writable_pt_show(struct hyp_sysfs_attr *attr, char *buffer)
+{
+ return xen_feature_show(XENFEAT_writable_page_tables, buffer);
+}
+
+HYPERVISOR_ATTR_RO(writable_pt);
+
+static struct attribute *xen_properties_attrs[] = {
+ &capabilities_attr.attr,
+ &changeset_attr.attr,
+ &virtual_start_attr.attr,
+ &writable_pt_attr.attr,
+ NULL
+};
+
+static struct attribute_group xen_properties_group = {
+ .name = "properties",
+ .attrs = xen_properties_attrs,
+};
+
+static int __init xen_properties_init(void)
+{
+ return sysfs_create_group(&hypervisor_subsys.kset.kobj,
+ &xen_properties_group);
+}
+
+static void xen_properties_destroy(void)
+{
+ sysfs_remove_group(&hypervisor_subsys.kset.kobj, &xen_properties_group);
+}
+
+static int __init hyper_sysfs_init(void)
+{
+ int ret = xen_sysfs_type_init();
+ if (ret)
+ goto out;
+ ret = xen_sysfs_version_init();
+ if (ret)
+ goto version_out;
+ ret = xen_compilation_init();
+ if (ret)
+ goto comp_out;
+ ret = xen_properties_init();
+ if (!ret)
+ goto out;
+
+ xen_compilation_destroy();
+comp_out:
+ xen_sysfs_version_destroy();
+version_out:
+ xen_sysfs_type_destroy();
+out:
+ return ret;
+}
+
+static void hyper_sysfs_exit(void)
+{
+ xen_properties_destroy();
+ xen_compilation_destroy();
+ xen_sysfs_version_destroy();
+ xen_sysfs_type_destroy();
+
+}
+
+module_init(hyper_sysfs_init);
+module_exit(hyper_sysfs_exit);
diff -r f163677f8767 -r a9f5cf43451f
linux-2.6-xen-sparse/include/xen/hypervisor_sysfs.h
--- /dev/null Tue Mar 21 16:55:44 2006
+++ b/linux-2.6-xen-sparse/include/xen/hypervisor_sysfs.h Tue Mar 21
18:19:11 2006
@@ -0,0 +1,32 @@
+/*
+ * copyright (c) 2006 IBM Corporation
+ * Authored by: Mike D. Day <ncmike@xxxxxxxxxx>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef _HYP_SYSFS_H_
+#define _HYP_SYSFS_H_
+
+#include <linux/kobject.h>
+#include <linux/sysfs.h>
+
+#define HYPERVISOR_ATTR_RO(_name) \
+static struct hyp_sysfs_attr _name##_attr = __ATTR_RO(_name)
+
+#define HYPERVISOR_ATTR_RW(_name) \
+static struct hyp_sysfs_attr _name##_attr = \
+ __ATTR(_name, 0644, _name##_show, _name##_store)
+
+extern struct subsystem hypervisor_subsys;
+
+struct hyp_sysfs_attr {
+ struct attribute attr;
+ ssize_t (*show)(struct hyp_sysfs_attr *, char *);
+ ssize_t (*store)(struct hyp_sysfs_attr *, const char *, size_t);
+ void *hyp_attr_data;
+};
+
+#endif /* _HYP_SYSFS_H_ */
diff -r f163677f8767 -r a9f5cf43451f
patches/linux-2.6.16/i386-mach-io-check-nmi.patch
--- /dev/null Tue Mar 21 16:55:44 2006
+++ b/patches/linux-2.6.16/i386-mach-io-check-nmi.patch Tue Mar 21 18:19:11 2006
@@ -0,0 +1,45 @@
+diff -pruN ../pristine-linux-2.6.16/arch/i386/kernel/traps.c
./arch/i386/kernel/traps.c
+--- ../pristine-linux-2.6.16/arch/i386/kernel/traps.c 2006-03-20
05:53:29.000000000 +0000
++++ ./arch/i386/kernel/traps.c 2006-03-20 19:38:17.000000000 +0000
+@@ -567,18 +567,11 @@ static void mem_parity_error(unsigned ch
+
+ static void io_check_error(unsigned char reason, struct pt_regs * regs)
+ {
+- unsigned long i;
+-
+ printk(KERN_EMERG "NMI: IOCK error (debug interrupt?)\n");
+ show_registers(regs);
+
+ /* Re-enable the IOCK line, wait for a few seconds */
+- reason = (reason & 0xf) | 8;
+- outb(reason, 0x61);
+- i = 2000;
+- while (--i) udelay(1000);
+- reason &= ~8;
+- outb(reason, 0x61);
++ clear_io_check_error(reason);
+ }
+
+ static void unknown_nmi_error(unsigned char reason, struct pt_regs * regs)
+diff -pruN ../pristine-linux-2.6.16/include/asm-i386/mach-default/mach_traps.h
./include/asm-i386/mach-default/mach_traps.h
+--- ../pristine-linux-2.6.16/include/asm-i386/mach-default/mach_traps.h
2006-03-20 05:53:29.000000000 +0000
++++ ./include/asm-i386/mach-default/mach_traps.h 2006-03-20
19:38:17.000000000 +0000
+@@ -15,6 +15,18 @@ static inline void clear_mem_error(unsig
+ outb(reason, 0x61);
+ }
+
++static inline void clear_io_check_error(unsigned char reason)
++{
++ unsigned long i;
++
++ reason = (reason & 0xf) | 8;
++ outb(reason, 0x61);
++ i = 2000;
++ while (--i) udelay(1000);
++ reason &= ~8;
++ outb(reason, 0x61);
++}
++
+ static inline unsigned char get_nmi_reason(void)
+ {
+ return inb(0x61);
diff -r f163677f8767 -r a9f5cf43451f patches/linux-2.6.16/net-csum.patch
--- /dev/null Tue Mar 21 16:55:44 2006
+++ b/patches/linux-2.6.16/net-csum.patch Tue Mar 21 18:19:11 2006
@@ -0,0 +1,41 @@
+diff -pruN ../pristine-linux-2.6.16/net/ipv4/netfilter/ip_nat_proto_tcp.c
./net/ipv4/netfilter/ip_nat_proto_tcp.c
+--- ../pristine-linux-2.6.16/net/ipv4/netfilter/ip_nat_proto_tcp.c
2006-03-20 05:53:29.000000000 +0000
++++ ./net/ipv4/netfilter/ip_nat_proto_tcp.c 2006-03-20 19:38:19.000000000
+0000
+@@ -129,10 +129,14 @@ tcp_manip_pkt(struct sk_buff **pskb,
+ if (hdrsize < sizeof(*hdr))
+ return 1;
+
+- hdr->check = ip_nat_cheat_check(~oldip, newip,
++ if ((*pskb)->proto_csum_blank) {
++ hdr->check = ip_nat_cheat_check(oldip, ~newip, hdr->check);
++ } else {
++ hdr->check = ip_nat_cheat_check(~oldip, newip,
+ ip_nat_cheat_check(oldport ^ 0xFFFF,
+ newport,
+ hdr->check));
++ }
+ return 1;
+ }
+
+diff -pruN ../pristine-linux-2.6.16/net/ipv4/netfilter/ip_nat_proto_udp.c
./net/ipv4/netfilter/ip_nat_proto_udp.c
+--- ../pristine-linux-2.6.16/net/ipv4/netfilter/ip_nat_proto_udp.c
2006-03-20 05:53:29.000000000 +0000
++++ ./net/ipv4/netfilter/ip_nat_proto_udp.c 2006-03-20 19:38:19.000000000
+0000
+@@ -113,11 +113,16 @@ udp_manip_pkt(struct sk_buff **pskb,
+ newport = tuple->dst.u.udp.port;
+ portptr = &hdr->dest;
+ }
+- if (hdr->check) /* 0 is a special case meaning no checksum */
+- hdr->check = ip_nat_cheat_check(~oldip, newip,
++ if (hdr->check) { /* 0 is a special case meaning no checksum */
++ if ((*pskb)->proto_csum_blank) {
++ hdr->check = ip_nat_cheat_check(oldip, ~newip,
hdr->check);
++ } else {
++ hdr->check = ip_nat_cheat_check(~oldip, newip,
+ ip_nat_cheat_check(*portptr ^ 0xFFFF,
+ newport,
+ hdr->check));
++ }
++ }
+ *portptr = newport;
+ return 1;
+ }
diff -r f163677f8767 -r a9f5cf43451f patches/linux-2.6.16/pmd-shared.patch
--- /dev/null Tue Mar 21 16:55:44 2006
+++ b/patches/linux-2.6.16/pmd-shared.patch Tue Mar 21 18:19:11 2006
@@ -0,0 +1,111 @@
+diff -pruN ../pristine-linux-2.6.16/arch/i386/mm/pageattr.c
./arch/i386/mm/pageattr.c
+--- ../pristine-linux-2.6.16/arch/i386/mm/pageattr.c 2006-03-20
05:53:29.000000000 +0000
++++ ./arch/i386/mm/pageattr.c 2006-03-20 19:38:23.000000000 +0000
+@@ -78,7 +78,7 @@ static void set_pmd_pte(pte_t *kpte, uns
+ unsigned long flags;
+
+ set_pte_atomic(kpte, pte); /* change init_mm */
+- if (PTRS_PER_PMD > 1)
++ if (HAVE_SHARED_KERNEL_PMD)
+ return;
+
+ spin_lock_irqsave(&pgd_lock, flags);
+diff -pruN ../pristine-linux-2.6.16/arch/i386/mm/pgtable.c
./arch/i386/mm/pgtable.c
+--- ../pristine-linux-2.6.16/arch/i386/mm/pgtable.c 2006-03-20
05:53:29.000000000 +0000
++++ ./arch/i386/mm/pgtable.c 2006-03-20 19:38:23.000000000 +0000
+@@ -215,9 +215,10 @@ void pgd_ctor(void *pgd, kmem_cache_t *c
+ spin_lock_irqsave(&pgd_lock, flags);
+ }
+
+- clone_pgd_range((pgd_t *)pgd + USER_PTRS_PER_PGD,
+- swapper_pg_dir + USER_PTRS_PER_PGD,
+- KERNEL_PGD_PTRS);
++ if (PTRS_PER_PMD == 1 || HAVE_SHARED_KERNEL_PMD)
++ clone_pgd_range((pgd_t *)pgd + USER_PTRS_PER_PGD,
++ swapper_pg_dir + USER_PTRS_PER_PGD,
++ KERNEL_PGD_PTRS);
+ if (PTRS_PER_PMD > 1)
+ return;
+
+@@ -249,6 +250,30 @@ pgd_t *pgd_alloc(struct mm_struct *mm)
+ goto out_oom;
+ set_pgd(&pgd[i], __pgd(1 + __pa(pmd)));
+ }
++
++ if (!HAVE_SHARED_KERNEL_PMD) {
++ unsigned long flags;
++
++ for (i = USER_PTRS_PER_PGD; i < PTRS_PER_PGD; i++) {
++ pmd_t *pmd = kmem_cache_alloc(pmd_cache, GFP_KERNEL);
++ if (!pmd)
++ goto out_oom;
++ set_pgd(&pgd[USER_PTRS_PER_PGD], __pgd(1 + __pa(pmd)));
++ }
++
++ spin_lock_irqsave(&pgd_lock, flags);
++ for (i = USER_PTRS_PER_PGD; i < PTRS_PER_PGD; i++) {
++ unsigned long v = (unsigned long)i << PGDIR_SHIFT;
++ pgd_t *kpgd = pgd_offset_k(v);
++ pud_t *kpud = pud_offset(kpgd, v);
++ pmd_t *kpmd = pmd_offset(kpud, v);
++ pmd_t *pmd = (void *)__va(pgd_val(pgd[i])-1);
++ memcpy(pmd, kpmd, PAGE_SIZE);
++ }
++ pgd_list_add(pgd);
++ spin_unlock_irqrestore(&pgd_lock, flags);
++ }
++
+ return pgd;
+
+ out_oom:
+@@ -263,9 +288,23 @@ void pgd_free(pgd_t *pgd)
+ int i;
+
+ /* in the PAE case user pgd entries are overwritten before usage */
+- if (PTRS_PER_PMD > 1)
+- for (i = 0; i < USER_PTRS_PER_PGD; ++i)
+- kmem_cache_free(pmd_cache, (void
*)__va(pgd_val(pgd[i])-1));
++ if (PTRS_PER_PMD > 1) {
++ for (i = 0; i < USER_PTRS_PER_PGD; ++i) {
++ pmd_t *pmd = (void *)__va(pgd_val(pgd[i])-1);
++ kmem_cache_free(pmd_cache, pmd);
++ }
++ if (!HAVE_SHARED_KERNEL_PMD) {
++ unsigned long flags;
++ spin_lock_irqsave(&pgd_lock, flags);
++ pgd_list_del(pgd);
++ spin_unlock_irqrestore(&pgd_lock, flags);
++ for (i = USER_PTRS_PER_PGD; i < PTRS_PER_PGD; i++) {
++ pmd_t *pmd = (void *)__va(pgd_val(pgd[i])-1);
++ memset(pmd, 0, PTRS_PER_PMD*sizeof(pmd_t));
++ kmem_cache_free(pmd_cache, pmd);
++ }
++ }
++ }
+ /* in the non-PAE case, free_pgtables() clears user pgd entries */
+ kmem_cache_free(pgd_cache, pgd);
+ }
+diff -pruN ../pristine-linux-2.6.16/include/asm-i386/pgtable-2level-defs.h
./include/asm-i386/pgtable-2level-defs.h
+--- ../pristine-linux-2.6.16/include/asm-i386/pgtable-2level-defs.h
2006-03-20 05:53:29.000000000 +0000
++++ ./include/asm-i386/pgtable-2level-defs.h 2006-03-20 19:38:23.000000000
+0000
+@@ -1,6 +1,8 @@
+ #ifndef _I386_PGTABLE_2LEVEL_DEFS_H
+ #define _I386_PGTABLE_2LEVEL_DEFS_H
+
++#define HAVE_SHARED_KERNEL_PMD 0
++
+ /*
+ * traditional i386 two-level paging structure:
+ */
+diff -pruN ../pristine-linux-2.6.16/include/asm-i386/pgtable-3level-defs.h
./include/asm-i386/pgtable-3level-defs.h
+--- ../pristine-linux-2.6.16/include/asm-i386/pgtable-3level-defs.h
2006-03-20 05:53:29.000000000 +0000
++++ ./include/asm-i386/pgtable-3level-defs.h 2006-03-20 19:38:23.000000000
+0000
+@@ -1,6 +1,8 @@
+ #ifndef _I386_PGTABLE_3LEVEL_DEFS_H
+ #define _I386_PGTABLE_3LEVEL_DEFS_H
+
++#define HAVE_SHARED_KERNEL_PMD 1
++
+ /*
+ * PGDIR_SHIFT determines what a top-level page table entry can map
+ */
diff -r f163677f8767 -r a9f5cf43451f patches/linux-2.6.16/smp-alts.patch
--- /dev/null Tue Mar 21 16:55:44 2006
+++ b/patches/linux-2.6.16/smp-alts.patch Tue Mar 21 18:19:11 2006
@@ -0,0 +1,591 @@
+diff -pruN ../pristine-linux-2.6.16/arch/i386/Kconfig ./arch/i386/Kconfig
+--- ../pristine-linux-2.6.16/arch/i386/Kconfig 2006-03-20 05:53:29.000000000
+0000
++++ ./arch/i386/Kconfig 2006-03-20 19:38:27.000000000 +0000
+@@ -202,6 +202,19 @@ config SMP
+
+ If you don't know what to do here, say N.
+
++config SMP_ALTERNATIVES
++ bool "SMP alternatives support (EXPERIMENTAL)"
++ depends on SMP && EXPERIMENTAL
++ help
++ Try to reduce the overhead of running an SMP kernel on a uniprocessor
++ host slightly by replacing certain key instruction sequences
++ according to whether we currently have more than one CPU available.
++ This should provide a noticeable boost to performance when
++ running SMP kernels on UP machines, and have negligible impact
++ when running on an true SMP host.
++
++ If unsure, say N.
++
+ config NR_CPUS
+ int "Maximum number of CPUs (2-255)"
+ range 2 255
+diff -pruN ../pristine-linux-2.6.16/arch/i386/kernel/Makefile
./arch/i386/kernel/Makefile
+--- ../pristine-linux-2.6.16/arch/i386/kernel/Makefile 2006-03-20
05:53:29.000000000 +0000
++++ ./arch/i386/kernel/Makefile 2006-03-20 19:38:27.000000000 +0000
+@@ -37,6 +37,7 @@ obj-$(CONFIG_EFI) += efi.o efi_stub.o
+ obj-$(CONFIG_DOUBLEFAULT) += doublefault.o
+ obj-$(CONFIG_VM86) += vm86.o
+ obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
++obj-$(CONFIG_SMP_ALTERNATIVES) += smpalts.o
+
+ EXTRA_AFLAGS := -traditional
+
+diff -pruN ../pristine-linux-2.6.16/arch/i386/kernel/smpalts.c
./arch/i386/kernel/smpalts.c
+--- ../pristine-linux-2.6.16/arch/i386/kernel/smpalts.c 1970-01-01
01:00:00.000000000 +0100
++++ ./arch/i386/kernel/smpalts.c 2006-03-20 19:38:27.000000000 +0000
+@@ -0,0 +1,85 @@
++#include <linux/kernel.h>
++#include <asm/system.h>
++#include <asm/smp_alt.h>
++#include <asm/processor.h>
++#include <asm/string.h>
++
++struct smp_replacement_record {
++ unsigned char targ_size;
++ unsigned char smp1_size;
++ unsigned char smp2_size;
++ unsigned char up_size;
++ unsigned char feature;
++ unsigned char data[0];
++};
++
++struct smp_alternative_record {
++ void *targ_start;
++ struct smp_replacement_record *repl;
++};
++
++extern struct smp_alternative_record __start_smp_alternatives_table,
++ __stop_smp_alternatives_table;
++extern unsigned long __init_begin, __init_end;
++
++void prepare_for_smp(void)
++{
++ struct smp_alternative_record *r;
++ printk(KERN_INFO "Enabling SMP...\n");
++ for (r = &__start_smp_alternatives_table;
++ r != &__stop_smp_alternatives_table;
++ r++) {
++ BUG_ON(r->repl->targ_size < r->repl->smp1_size);
++ BUG_ON(r->repl->targ_size < r->repl->smp2_size);
++ BUG_ON(r->repl->targ_size < r->repl->up_size);
++ if (system_state == SYSTEM_RUNNING &&
++ r->targ_start >= (void *)&__init_begin &&
++ r->targ_start < (void *)&__init_end)
++ continue;
++ if (r->repl->feature != (unsigned char)-1 &&
++ boot_cpu_has(r->repl->feature)) {
++ memcpy(r->targ_start,
++ r->repl->data + r->repl->smp1_size,
++ r->repl->smp2_size);
++ memset(r->targ_start + r->repl->smp2_size,
++ 0x90,
++ r->repl->targ_size - r->repl->smp2_size);
++ } else {
++ memcpy(r->targ_start,
++ r->repl->data,
++ r->repl->smp1_size);
++ memset(r->targ_start + r->repl->smp1_size,
++ 0x90,
++ r->repl->targ_size - r->repl->smp1_size);
++ }
++ }
++ /* Paranoia */
++ asm volatile ("jmp 1f\n1:");
++ mb();
++}
++
++void unprepare_for_smp(void)
++{
++ struct smp_alternative_record *r;
++ printk(KERN_INFO "Disabling SMP...\n");
++ for (r = &__start_smp_alternatives_table;
++ r != &__stop_smp_alternatives_table;
++ r++) {
++ BUG_ON(r->repl->targ_size < r->repl->smp1_size);
++ BUG_ON(r->repl->targ_size < r->repl->smp2_size);
++ BUG_ON(r->repl->targ_size < r->repl->up_size);
++ if (system_state == SYSTEM_RUNNING &&
++ r->targ_start >= (void *)&__init_begin &&
++ r->targ_start < (void *)&__init_end)
++ continue;
++ memcpy(r->targ_start,
++ r->repl->data + r->repl->smp1_size + r->repl->smp2_size,
++ r->repl->up_size);
++ memset(r->targ_start + r->repl->up_size,
++ 0x90,
++ r->repl->targ_size - r->repl->up_size);
++ }
++ /* Paranoia */
++ asm volatile ("jmp 1f\n1:");
++ mb();
++}
+diff -pruN ../pristine-linux-2.6.16/arch/i386/kernel/smpboot.c
./arch/i386/kernel/smpboot.c
+--- ../pristine-linux-2.6.16/arch/i386/kernel/smpboot.c 2006-03-20
05:53:29.000000000 +0000
++++ ./arch/i386/kernel/smpboot.c 2006-03-20 19:38:27.000000000 +0000
+@@ -1218,6 +1218,11 @@ static void __init smp_boot_cpus(unsigne
+ if (max_cpus <= cpucount+1)
+ continue;
+
++#ifdef CONFIG_SMP_ALTERNATIVES
++ if (kicked == 1)
++ prepare_for_smp();
++#endif
++
+ if (((cpu = alloc_cpu_id()) <= 0) || do_boot_cpu(apicid, cpu))
+ printk("CPU #%d not responding - cannot use it.\n",
+ apicid);
+@@ -1396,6 +1401,11 @@ int __devinit __cpu_up(unsigned int cpu)
+ return -EIO;
+ }
+
++#ifdef CONFIG_SMP_ALTERNATIVES
++ if (num_online_cpus() == 1)
++ prepare_for_smp();
++#endif
++
+ local_irq_enable();
+ per_cpu(cpu_state, cpu) = CPU_UP_PREPARE;
+ /* Unleash the CPU! */
+diff -pruN ../pristine-linux-2.6.16/arch/i386/kernel/vmlinux.lds.S
./arch/i386/kernel/vmlinux.lds.S
+--- ../pristine-linux-2.6.16/arch/i386/kernel/vmlinux.lds.S 2006-03-20
05:53:29.000000000 +0000
++++ ./arch/i386/kernel/vmlinux.lds.S 2006-03-20 19:38:27.000000000 +0000
+@@ -34,6 +34,13 @@ SECTIONS
+ __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) { *(__ex_table) }
+ __stop___ex_table = .;
+
++ . = ALIGN(16);
++ __start_smp_alternatives_table = .;
++ __smp_alternatives : { *(__smp_alternatives) }
++ __stop_smp_alternatives_table = .;
++
++ __smp_replacements : { *(__smp_replacements) }
++
+ RODATA
+
+ /* writeable */
+diff -pruN ../pristine-linux-2.6.16/include/asm-i386/atomic.h
./include/asm-i386/atomic.h
+--- ../pristine-linux-2.6.16/include/asm-i386/atomic.h 2006-03-20
05:53:29.000000000 +0000
++++ ./include/asm-i386/atomic.h 2006-03-20 19:38:27.000000000 +0000
+@@ -4,18 +4,13 @@
+ #include <linux/config.h>
+ #include <linux/compiler.h>
+ #include <asm/processor.h>
++#include <asm/smp_alt.h>
+
+ /*
+ * Atomic operations that C can't guarantee us. Useful for
+ * resource counting etc..
+ */
+
+-#ifdef CONFIG_SMP
+-#define LOCK "lock ; "
+-#else
+-#define LOCK ""
+-#endif
+-
+ /*
+ * Make sure gcc doesn't try to be clever and move things around
+ * on us. We need to use _exactly_ the address the user gave us,
+diff -pruN ../pristine-linux-2.6.16/include/asm-i386/bitops.h
./include/asm-i386/bitops.h
+--- ../pristine-linux-2.6.16/include/asm-i386/bitops.h 2006-03-20
05:53:29.000000000 +0000
++++ ./include/asm-i386/bitops.h 2006-03-20 19:38:27.000000000 +0000
+@@ -7,6 +7,7 @@
+
+ #include <linux/config.h>
+ #include <linux/compiler.h>
++#include <asm/smp_alt.h>
+
+ /*
+ * These have to be done with inline assembly: that way the bit-setting
+@@ -16,12 +17,6 @@
+ * bit 0 is the LSB of addr; bit 32 is the LSB of (addr+1).
+ */
+
+-#ifdef CONFIG_SMP
+-#define LOCK_PREFIX "lock ; "
+-#else
+-#define LOCK_PREFIX ""
+-#endif
+-
+ #define ADDR (*(volatile long *) addr)
+
+ /**
+@@ -41,7 +36,7 @@
+ */
+ static inline void set_bit(int nr, volatile unsigned long * addr)
+ {
+- __asm__ __volatile__( LOCK_PREFIX
++ __asm__ __volatile__( LOCK
+ "btsl %1,%0"
+ :"+m" (ADDR)
+ :"Ir" (nr));
+@@ -76,7 +71,7 @@ static inline void __set_bit(int nr, vol
+ */
+ static inline void clear_bit(int nr, volatile unsigned long * addr)
+ {
+- __asm__ __volatile__( LOCK_PREFIX
++ __asm__ __volatile__( LOCK
+ "btrl %1,%0"
+ :"+m" (ADDR)
+ :"Ir" (nr));
+@@ -121,7 +116,7 @@ static inline void __change_bit(int nr,
+ */
+ static inline void change_bit(int nr, volatile unsigned long * addr)
+ {
+- __asm__ __volatile__( LOCK_PREFIX
++ __asm__ __volatile__( LOCK
+ "btcl %1,%0"
+ :"+m" (ADDR)
+ :"Ir" (nr));
+@@ -140,7 +135,7 @@ static inline int test_and_set_bit(int n
+ {
+ int oldbit;
+
+- __asm__ __volatile__( LOCK_PREFIX
++ __asm__ __volatile__( LOCK
+ "btsl %2,%1\n\tsbbl %0,%0"
+ :"=r" (oldbit),"+m" (ADDR)
+ :"Ir" (nr) : "memory");
+@@ -180,7 +175,7 @@ static inline int test_and_clear_bit(int
+ {
+ int oldbit;
+
+- __asm__ __volatile__( LOCK_PREFIX
++ __asm__ __volatile__( LOCK
+ "btrl %2,%1\n\tsbbl %0,%0"
+ :"=r" (oldbit),"+m" (ADDR)
+ :"Ir" (nr) : "memory");
+@@ -231,7 +226,7 @@ static inline int test_and_change_bit(in
+ {
+ int oldbit;
+
+- __asm__ __volatile__( LOCK_PREFIX
++ __asm__ __volatile__( LOCK
+ "btcl %2,%1\n\tsbbl %0,%0"
+ :"=r" (oldbit),"+m" (ADDR)
+ :"Ir" (nr) : "memory");
+diff -pruN ../pristine-linux-2.6.16/include/asm-i386/futex.h
./include/asm-i386/futex.h
+--- ../pristine-linux-2.6.16/include/asm-i386/futex.h 2006-03-20
05:53:29.000000000 +0000
++++ ./include/asm-i386/futex.h 2006-03-20 19:38:27.000000000 +0000
+@@ -28,7 +28,7 @@
+ "1: movl %2, %0\n\
+ movl %0, %3\n" \
+ insn "\n" \
+-"2: " LOCK_PREFIX "cmpxchgl %3, %2\n\
++"2: " LOCK "cmpxchgl %3, %2\n\
+ jnz 1b\n\
+ 3: .section .fixup,\"ax\"\n\
+ 4: mov %5, %1\n\
+@@ -68,7 +68,7 @@ futex_atomic_op_inuser (int encoded_op,
+ #endif
+ switch (op) {
+ case FUTEX_OP_ADD:
+- __futex_atomic_op1(LOCK_PREFIX "xaddl %0, %2", ret,
++ __futex_atomic_op1(LOCK "xaddl %0, %2", ret,
+ oldval, uaddr, oparg);
+ break;
+ case FUTEX_OP_OR:
+diff -pruN ../pristine-linux-2.6.16/include/asm-i386/rwsem.h
./include/asm-i386/rwsem.h
+--- ../pristine-linux-2.6.16/include/asm-i386/rwsem.h 2006-03-20
05:53:29.000000000 +0000
++++ ./include/asm-i386/rwsem.h 2006-03-20 19:38:27.000000000 +0000
+@@ -40,6 +40,7 @@
+
+ #include <linux/list.h>
+ #include <linux/spinlock.h>
++#include <asm/smp_alt.h>
+
+ struct rwsem_waiter;
+
+@@ -99,7 +100,7 @@ static inline void __down_read(struct rw
+ {
+ __asm__ __volatile__(
+ "# beginning down_read\n\t"
+-LOCK_PREFIX " incl (%%eax)\n\t" /* adds 0x00000001, returns the old
value */
++LOCK " incl (%%eax)\n\t" /* adds 0x00000001, returns the old
value */
+ " js 2f\n\t" /* jump if we weren't granted the lock */
+ "1:\n\t"
+ LOCK_SECTION_START("")
+@@ -130,7 +131,7 @@ static inline int __down_read_trylock(st
+ " movl %1,%2\n\t"
+ " addl %3,%2\n\t"
+ " jle 2f\n\t"
+-LOCK_PREFIX " cmpxchgl %2,%0\n\t"
++LOCK " cmpxchgl %2,%0\n\t"
+ " jnz 1b\n\t"
+ "2:\n\t"
+ "# ending __down_read_trylock\n\t"
+@@ -150,7 +151,7 @@ static inline void __down_write(struct r
+ tmp = RWSEM_ACTIVE_WRITE_BIAS;
+ __asm__ __volatile__(
+ "# beginning down_write\n\t"
+-LOCK_PREFIX " xadd %%edx,(%%eax)\n\t" /* subtract 0x0000ffff, returns
the old value */
++LOCK " xadd %%edx,(%%eax)\n\t" /* subtract 0x0000ffff, returns
the old value */
+ " testl %%edx,%%edx\n\t" /* was the count 0 before? */
+ " jnz 2f\n\t" /* jump if we weren't granted the lock */
+ "1:\n\t"
+@@ -188,7 +189,7 @@ static inline void __up_read(struct rw_s
+ __s32 tmp = -RWSEM_ACTIVE_READ_BIAS;
+ __asm__ __volatile__(
+ "# beginning __up_read\n\t"
+-LOCK_PREFIX " xadd %%edx,(%%eax)\n\t" /* subtracts 1, returns the old
value */
++LOCK " xadd %%edx,(%%eax)\n\t" /* subtracts 1, returns the old
value */
+ " js 2f\n\t" /* jump if the lock is being waited upon */
+ "1:\n\t"
+ LOCK_SECTION_START("")
+@@ -214,7 +215,7 @@ static inline void __up_write(struct rw_
+ __asm__ __volatile__(
+ "# beginning __up_write\n\t"
+ " movl %2,%%edx\n\t"
+-LOCK_PREFIX " xaddl %%edx,(%%eax)\n\t" /* tries to transition
0xffff0001 -> 0x00000000 */
++LOCK " xaddl %%edx,(%%eax)\n\t" /* tries to transition
0xffff0001 -> 0x00000000 */
+ " jnz 2f\n\t" /* jump if the lock is being waited upon */
+ "1:\n\t"
+ LOCK_SECTION_START("")
+@@ -239,7 +240,7 @@ static inline void __downgrade_write(str
+ {
+ __asm__ __volatile__(
+ "# beginning __downgrade_write\n\t"
+-LOCK_PREFIX " addl %2,(%%eax)\n\t" /* transitions 0xZZZZ0001 ->
0xYYYY0001 */
++LOCK " addl %2,(%%eax)\n\t" /* transitions 0xZZZZ0001 ->
0xYYYY0001 */
+ " js 2f\n\t" /* jump if the lock is being waited upon */
+ "1:\n\t"
+ LOCK_SECTION_START("")
+@@ -263,7 +264,7 @@ LOCK_PREFIX " addl %2,(%%eax)\n\t"
+ static inline void rwsem_atomic_add(int delta, struct rw_semaphore *sem)
+ {
+ __asm__ __volatile__(
+-LOCK_PREFIX "addl %1,%0"
++LOCK "addl %1,%0"
+ : "=m"(sem->count)
+ : "ir"(delta), "m"(sem->count));
+ }
+@@ -276,7 +277,7 @@ static inline int rwsem_atomic_update(in
+ int tmp = delta;
+
+ __asm__ __volatile__(
+-LOCK_PREFIX "xadd %0,(%2)"
++LOCK "xadd %0,(%2)"
+ : "+r"(tmp), "=m"(sem->count)
+ : "r"(sem), "m"(sem->count)
+ : "memory");
+diff -pruN ../pristine-linux-2.6.16/include/asm-i386/smp_alt.h
./include/asm-i386/smp_alt.h
+--- ../pristine-linux-2.6.16/include/asm-i386/smp_alt.h 1970-01-01
01:00:00.000000000 +0100
++++ ./include/asm-i386/smp_alt.h 2006-03-20 19:38:27.000000000 +0000
+@@ -0,0 +1,32 @@
++#ifndef __ASM_SMP_ALT_H__
++#define __ASM_SMP_ALT_H__
++
++#include <linux/config.h>
++
++#ifdef CONFIG_SMP
++#if defined(CONFIG_SMP_ALTERNATIVES) && !defined(MODULE)
++#define LOCK \
++ "6677: nop\n" \
++ ".section __smp_alternatives,\"a\"\n" \
++ ".long 6677b\n" \
++ ".long 6678f\n" \
++ ".previous\n" \
++ ".section __smp_replacements,\"a\"\n" \
++ "6678: .byte 1\n" \
++ ".byte 1\n" \
++ ".byte 0\n" \
++ ".byte 1\n" \
++ ".byte -1\n" \
++ "lock\n" \
++ "nop\n" \
++ ".previous\n"
++void prepare_for_smp(void);
++void unprepare_for_smp(void);
++#else
++#define LOCK "lock ; "
++#endif
++#else
++#define LOCK ""
++#endif
++
++#endif /* __ASM_SMP_ALT_H__ */
+diff -pruN ../pristine-linux-2.6.16/include/asm-i386/spinlock.h
./include/asm-i386/spinlock.h
+--- ../pristine-linux-2.6.16/include/asm-i386/spinlock.h 2006-03-20
05:53:29.000000000 +0000
++++ ./include/asm-i386/spinlock.h 2006-03-20 19:38:27.000000000 +0000
+@@ -6,6 +6,7 @@
+ #include <asm/page.h>
+ #include <linux/config.h>
+ #include <linux/compiler.h>
++#include <asm/smp_alt.h>
+
+ /*
+ * Your basic SMP spinlocks, allowing only a single CPU anywhere
+@@ -23,7 +24,8 @@
+
+ #define __raw_spin_lock_string \
+ "\n1:\t" \
+- "lock ; decb %0\n\t" \
++ LOCK \
++ "decb %0\n\t" \
+ "jns 3f\n" \
+ "2:\t" \
+ "rep;nop\n\t" \
+@@ -34,7 +36,8 @@
+
+ #define __raw_spin_lock_string_flags \
+ "\n1:\t" \
+- "lock ; decb %0\n\t" \
++ LOCK \
++ "decb %0\n\t" \
+ "jns 4f\n\t" \
+ "2:\t" \
+ "testl $0x200, %1\n\t" \
+@@ -65,10 +68,34 @@ static inline void __raw_spin_lock_flags
+ static inline int __raw_spin_trylock(raw_spinlock_t *lock)
+ {
+ char oldval;
++#ifdef CONFIG_SMP_ALTERNATIVES
+ __asm__ __volatile__(
+- "xchgb %b0,%1"
++ "1:movb %1,%b0\n"
++ "movb $0,%1\n"
++ "2:"
++ ".section __smp_alternatives,\"a\"\n"
++ ".long 1b\n"
++ ".long 3f\n"
++ ".previous\n"
++ ".section __smp_replacements,\"a\"\n"
++ "3: .byte 2b - 1b\n"
++ ".byte 5f-4f\n"
++ ".byte 0\n"
++ ".byte 6f-5f\n"
++ ".byte -1\n"
++ "4: xchgb %b0,%1\n"
++ "5: movb %1,%b0\n"
++ "movb $0,%1\n"
++ "6:\n"
++ ".previous\n"
+ :"=q" (oldval), "=m" (lock->slock)
+ :"0" (0) : "memory");
++#else
++ __asm__ __volatile__(
++ "xchgb %b0,%1\n"
++ :"=q" (oldval), "=m" (lock->slock)
++ :"0" (0) : "memory");
++#endif
+ return oldval > 0;
+ }
+
+@@ -178,12 +205,12 @@ static inline int __raw_write_trylock(ra
+
+ static inline void __raw_read_unlock(raw_rwlock_t *rw)
+ {
+- asm volatile("lock ; incl %0" :"=m" (rw->lock) : : "memory");
++ asm volatile(LOCK "incl %0" :"=m" (rw->lock) : : "memory");
+ }
+
+ static inline void __raw_write_unlock(raw_rwlock_t *rw)
+ {
+- asm volatile("lock ; addl $" RW_LOCK_BIAS_STR ", %0"
++ asm volatile(LOCK "addl $" RW_LOCK_BIAS_STR ", %0"
+ : "=m" (rw->lock) : : "memory");
+ }
+
+diff -pruN ../pristine-linux-2.6.16/include/asm-i386/system.h
./include/asm-i386/system.h
+--- ../pristine-linux-2.6.16/include/asm-i386/system.h 2006-03-20
05:53:29.000000000 +0000
++++ ./include/asm-i386/system.h 2006-03-20 19:38:27.000000000 +0000
+@@ -5,7 +5,7 @@
+ #include <linux/kernel.h>
+ #include <asm/segment.h>
+ #include <asm/cpufeature.h>
+-#include <linux/bitops.h> /* for LOCK_PREFIX */
++#include <asm/smp_alt.h>
+
+ #ifdef __KERNEL__
+
+@@ -271,19 +271,19 @@ static inline unsigned long __cmpxchg(vo
+ unsigned long prev;
+ switch (size) {
+ case 1:
+- __asm__ __volatile__(LOCK_PREFIX "cmpxchgb %b1,%2"
++ __asm__ __volatile__(LOCK "cmpxchgb %b1,%2"
+ : "=a"(prev)
+ : "q"(new), "m"(*__xg(ptr)), "0"(old)
+ : "memory");
+ return prev;
+ case 2:
+- __asm__ __volatile__(LOCK_PREFIX "cmpxchgw %w1,%2"
++ __asm__ __volatile__(LOCK "cmpxchgw %w1,%2"
+ : "=a"(prev)
+ : "r"(new), "m"(*__xg(ptr)), "0"(old)
+ : "memory");
+ return prev;
+ case 4:
+- __asm__ __volatile__(LOCK_PREFIX "cmpxchgl %1,%2"
++ __asm__ __volatile__(LOCK "cmpxchgl %1,%2"
+ : "=a"(prev)
+ : "r"(new), "m"(*__xg(ptr)), "0"(old)
+ : "memory");
+@@ -336,7 +336,7 @@ static inline unsigned long long __cmpxc
+ unsigned long long new)
+ {
+ unsigned long long prev;
+- __asm__ __volatile__(LOCK_PREFIX "cmpxchg8b %3"
++ __asm__ __volatile__(LOCK "cmpxchg8b %3"
+ : "=A"(prev)
+ : "b"((unsigned long)new),
+ "c"((unsigned long)(new >> 32)),
+@@ -503,11 +503,55 @@ struct alt_instr {
+ #endif
+
+ #ifdef CONFIG_SMP
++#if defined(CONFIG_SMP_ALTERNATIVES) && !defined(MODULE)
++#define smp_alt_mb(instr) \
++__asm__ __volatile__("6667:\nnop\nnop\nnop\nnop\nnop\nnop\n6668:\n" \
++ ".section __smp_alternatives,\"a\"\n" \
++ ".long 6667b\n" \
++ ".long 6673f\n" \
++ ".previous\n" \
++ ".section __smp_replacements,\"a\"\n" \
++ "6673:.byte 6668b-6667b\n" \
++ ".byte 6670f-6669f\n" \
++ ".byte 6671f-6670f\n" \
++ ".byte 0\n" \
++ ".byte %c0\n" \
++ "6669:lock;addl $0,0(%%esp)\n" \
++ "6670:" instr "\n" \
++ "6671:\n" \
++ ".previous\n" \
++ : \
++ : "i" (X86_FEATURE_XMM2) \
++ : "memory")
++#define smp_rmb() smp_alt_mb("lfence")
++#define smp_mb() smp_alt_mb("mfence")
++#define set_mb(var, value) do { \
++unsigned long __set_mb_temp; \
++__asm__ __volatile__("6667:movl %1, %0\n6668:\n" \
++ ".section __smp_alternatives,\"a\"\n" \
++ ".long 6667b\n" \
++ ".long 6673f\n" \
++ ".previous\n" \
++ ".section __smp_replacements,\"a\"\n" \
++ "6673: .byte 6668b-6667b\n" \
++ ".byte 6670f-6669f\n" \
++ ".byte 0\n" \
++ ".byte 6671f-6670f\n" \
++ ".byte -1\n" \
++ "6669: xchg %1, %0\n" \
++ "6670:movl %1, %0\n" \
++ "6671:\n" \
++ ".previous\n" \
++ : "=m" (var), "=r" (__set_mb_temp) \
++ : "1" (value) \
++ : "memory"); } while (0)
++#else
+ #define smp_mb() mb()
+ #define smp_rmb() rmb()
++#define set_mb(var, value) do { (void) xchg(&var, value); } while (0)
++#endif
+ #define smp_wmb() wmb()
+ #define smp_read_barrier_depends() read_barrier_depends()
+-#define set_mb(var, value) do { (void) xchg(&var, value); } while (0)
+ #else
+ #define smp_mb() barrier()
+ #define smp_rmb() barrier()
diff -r f163677f8767 -r a9f5cf43451f
tools/xm-test/tests/vtpm/03_vtpm-susp_res.py
--- /dev/null Tue Mar 21 16:55:44 2006
+++ b/tools/xm-test/tests/vtpm/03_vtpm-susp_res.py Tue Mar 21 18:19:11 2006
@@ -0,0 +1,105 @@
+#!/usr/bin/python
+
+# Copyright (C) International Business Machines Corp., 2006
+# Author: Stefan Berger <stefanb@xxxxxxxxxx>
+
+# Positive Test: create domain with virtual TPM attached at build time,
+# check list of pcrs; suspend and resume the domain and
+# check list of pcrs again
+
+from XmTestLib import *
+from vtpm_utils import *
+import commands
+import os
+import os.path
+
+config = {"vtpm":"instance=1,backend=0"}
+domain = XmTestDomain(extraConfig=config)
+
+try:
+ domain.start()
+except DomainError, e:
+ if verbose:
+ print e.extra
+ vtpm_cleanup(domain.getName())
+ FAIL("Unable to create domain")
+
+domName = domain.getName()
+
+try:
+ console = XmConsole(domain.getName())
+except ConsoleError, e:
+ vtpm_cleanup(domName)
+ FAIL(str(e))
+
+try:
+ console.sendInput("input")
+except ConsoleError, e:
+ saveLog(console.getHistory())
+ vtpm_cleanup(domName)
+ FAIL(str(e))
+
+try:
+ run = console.runCmd("cat /sys/devices/platform/tpm_vtpm/pcrs")
+except ConsoleError, e:
+ saveLog(console.getHistory())
+ vtpm_cleanup(domName)
+ FAIL(str(e))
+
+if re.search("No such file",run["output"]):
+ FAIL("TPM frontend support not compiled into (domU?) kernel")
+
+console.closeConsole()
+
+try:
+ status, ouptut = traceCommand("xm save %s %s.save" %
+ (domName, domName),
+ timeout=30)
+except TimeoutError, e:
+ saveLog(console.getHistory())
+ vtpm_cleanup(domName)
+ FAIL(str(e))
+
+if status != 0:
+ saveLog(console.getHistory())
+ vtpm_cleanup(domName)
+ FAIL("xm save did not succeed")
+
+try:
+ status, ouptut = traceCommand("xm restore %s.save" %
+ (domName),
+ timeout=30)
+except TimeoutError, e:
+ os.remove("%s.save" % domName)
+ saveLog(console.getHistory())
+ vtpm_cleanup(domName)
+ FAIL(str(e))
+
+os.remove("%s.save" % domName)
+
+if status != 0:
+ saveLog(console.getHistory())
+ vtpm_cleanup(domName)
+ FAIL("xm restore did not succeed")
+
+try:
+ console = XmConsole(domain.getName())
+except ConsoleError, e:
+ vtpm_cleanup(domName)
+ FAIL(str(e))
+
+try:
+ run = console.runCmd("cat /sys/devices/platform/tpm_vtpm/pcrs")
+except ConsoleError, e:
+ saveLog(console.getHistory())
+ vtpm_cleanup(domName)
+ FAIL(str(e))
+
+console.closeConsole()
+
+domain.stop()
+
+vtpm_cleanup(domName)
+
+if not re.search("PCR-00:",run["output"]):
+ FAIL("Virtual TPM is not working correctly on /dev/vtpm on backend
side")
diff -r f163677f8767 -r a9f5cf43451f tools/xm-test/tests/vtpm/vtpm_utils.py
--- /dev/null Tue Mar 21 16:55:44 2006
+++ b/tools/xm-test/tests/vtpm/vtpm_utils.py Tue Mar 21 18:19:11 2006
@@ -0,0 +1,19 @@
+#!/usr/bin/python
+
+# Copyright (C) International Business Machines Corp., 2006
+# Author: Stefan Berger <stefanb@xxxxxxxxxx>
+
+from XmTestLib import *
+
+if ENABLE_HVM_SUPPORT:
+ SKIP("vtpm tests not supported for HVM domains")
+
+if not os.path.isfile("/dev/tpm0"):
+ SKIP("This machine has no hardware TPM; cannot run this test")
+
+status, output = traceCommand("ps aux | grep vtpm_manager | grep -v grep")
+if output == "":
+ FAIL("virtual TPM manager must be started to run this test")
+
+def vtpm_cleanup(domName):
+ traceCommand("/etc/xen/scripts/vtpm-delete %s" % domName)
diff -r f163677f8767 -r a9f5cf43451f xen/Post.mk
--- /dev/null Tue Mar 21 16:55:44 2006
+++ b/xen/Post.mk Tue Mar 21 18:19:11 2006
@@ -0,0 +1,27 @@
+# Ensure each subdirectory has exactly one trailing slash.
+subdir-n := $(patsubst %,%/,$(patsubst %/,%,$(subdir-n)))
+subdir-y := $(patsubst %,%/,$(patsubst %/,%,$(subdir-y)))
+
+# Add explicitly declared subdirectories to the object list.
+obj-y += $(patsubst %,%/built_in.o,$(subdir-y))
+
+# Add implicitly declared subdirectories (in the object list) to the
+# subdirectory list, and rewrite the object-list entry.
+subdir-y += $(filter %/,$(obj-y))
+obj-y := $(patsubst %/,%/built-in.o,$(obj-y))
+
+subdir-all := $(subdir-y) $(subdir-n)
+
+built_in.o: $(obj-y)
+ $(LD) $(LDFLAGS) -r -o $@ $^
+
+.PHONY: FORCE
+FORCE:
+
+%/built_in.o: FORCE
+ $(MAKE) -C $*
+
+clean:: $(addprefix _clean_, $(subdir-all)) FORCE
+ rm -f *.o *~ core
+_clean_%/: FORCE
+ $(MAKE) -C $* clean
diff -r f163677f8767 -r a9f5cf43451f xen/arch/ia64/linux-xen/Makefile
--- /dev/null Tue Mar 21 16:55:44 2006
+++ b/xen/arch/ia64/linux-xen/Makefile Tue Mar 21 18:19:11 2006
@@ -0,0 +1,19 @@
+include $(BASEDIR)/Rules.mk
+
+obj-y += efi.o
+obj-y += entry.o
+obj-y += irq_ia64.o
+obj-y += mm_contig.o
+obj-y += pal.o
+obj-y += process-linux-xen.o
+obj-y += sal.o
+obj-y += setup.o
+obj-y += smpboot.o
+obj-y += smp.o
+obj-y += sort.o
+obj-y += time.o
+obj-y += tlb.o
+obj-y += unaligned.o
+obj-y += unwind.o
+
+include $(BASEDIR)/Post.mk
diff -r f163677f8767 -r a9f5cf43451f xen/arch/ia64/linux/Makefile
--- /dev/null Tue Mar 21 16:55:44 2006
+++ b/xen/arch/ia64/linux/Makefile Tue Mar 21 18:19:11 2006
@@ -0,0 +1,56 @@
+include $(BASEDIR)/Rules.mk
+
+
+obj-y += bitop.o
+obj-y += clear_page.o
+obj-y += cmdline.o
+obj-y += copy_page_mck.o
+obj-y += efi_stub.o
+obj-y += extable.o
+obj-y += flush.o
+obj-y += hpsim.o
+obj-y += ia64_ksyms.o
+obj-y += irq_lsapic.o
+obj-y += linuxextable.o
+obj-y += machvec.o
+obj-y += memcpy_mck.o
+obj-y += memset.o
+obj-y += strlen.o
+
+obj-y += __divsi3.o
+obj-y += __udivsi3.o
+obj-y += __modsi3.o
+obj-y += __umodsi3.o
+obj-y += __divdi3.o
+obj-y += __udivdi3.o
+obj-y += __moddi3.o
+obj-y += __umoddi3.o
+
+include $(BASEDIR)/Post.mk
+
+## variants of divide/modulo
+## see files in xen/arch/ia64/linux/lib (linux/arch/ia64/lib)
+__divdi3.o: idiv64.S
+ $(CC) $(AFLAGS) $(AFLAGS_KERNEL) -c -o $@ $<
+
+__udivdi3.o: idiv64.S
+ $(CC) $(AFLAGS) $(AFLAGS_KERNEL) -c -DUNSIGNED -c -o $@ $<
+
+__moddi3.o: idiv64.S
+ $(CC) $(AFLAGS) $(AFLAGS_KERNEL) -c -DMODULO -c -o $@ $<
+
+__umoddi3.o: idiv64.S
+ $(CC) $(AFLAGS) $(AFLAGS_KERNEL) -c -DMODULO -DUNSIGNED -c -o $@ $<
+
+__divsi3.o: idiv32.S
+ $(CC) $(AFLAGS) $(AFLAGS_KERNEL) -c -o $@ $<
+
+__udivsi3.o: idiv32.S
+ $(CC) $(AFLAGS) $(AFLAGS_KERNEL) -c -DUNSIGNED -c -o $@ $<
+
+__modsi3.o: idiv32.S
+ $(CC) $(AFLAGS) $(AFLAGS_KERNEL) -c -DMODULO -c -o $@ $<
+
+__umodsi3.o: idiv32.S
+ $(CC) $(AFLAGS) $(AFLAGS_KERNEL) -c -DMODULO -DUNSIGNED -c -o $@ $<
+
diff -r f163677f8767 -r a9f5cf43451f xen/arch/ia64/vmx/Makefile
--- /dev/null Tue Mar 21 16:55:44 2006
+++ b/xen/arch/ia64/vmx/Makefile Tue Mar 21 18:19:11 2006
@@ -0,0 +1,24 @@
+include $(BASEDIR)/Rules.mk
+
+obj-y += hvm_vioapic.o
+obj-y += mm.o
+obj-y += mmio.o
+obj-y += pal_emul.o
+obj-y += vlsapic.o
+obj-y += vmmu.o
+obj-y += vmx_entry.o
+obj-y += vmx_hypercall.o
+obj-y += vmx_init.o
+obj-y += vmx_interrupt.o
+obj-y += vmx_irq_ia64.o
+obj-y += vmx_ivt.o
+obj-y += vmx_phy_mode.o
+obj-y += vmx_process.o
+obj-y += vmx_support.o
+obj-y += vmx_utility.o
+obj-y += vmx_vcpu.o
+obj-y += vmx_virt.o
+obj-y += vmx_vsa.o
+obj-y += vtlb.o
+
+include $(BASEDIR)/Post.mk
diff -r f163677f8767 -r a9f5cf43451f xen/arch/ia64/xen/Makefile
--- /dev/null Tue Mar 21 16:55:44 2006
+++ b/xen/arch/ia64/xen/Makefile Tue Mar 21 18:19:11 2006
@@ -0,0 +1,30 @@
+include $(BASEDIR)/Rules.mk
+
+obj-y += acpi.o
+obj-y += dom0_ops.o
+obj-y += domain.o
+obj-y += dom_fw.o
+obj-y += hpsimserial.o
+obj-y += hypercall.o
+obj-y += hyperprivop.o
+obj-y += idle0_task.o
+obj-y += irq.o
+obj-y += ivt.o
+obj-y += mm_init.o
+obj-y += pcdp.o
+obj-y += privop.o
+obj-y += process.o
+obj-y += regionreg.o
+obj-y += sn_console.o
+obj-y += vcpu.o
+obj-y += vhpt.o
+obj-y += xenasm.o
+obj-y += xenirq.o
+obj-y += xenmem.o
+obj-y += xenmisc.o
+obj-y += xensetup.o
+obj-y += xentime.o
+
+obj-$(crash_debug) += gdbstub.o
+
+include $(BASEDIR)/Post.mk
diff -r f163677f8767 -r a9f5cf43451f xen/arch/x86/acpi/Makefile
--- /dev/null Tue Mar 21 16:55:44 2006
+++ b/xen/arch/x86/acpi/Makefile Tue Mar 21 18:19:11 2006
@@ -0,0 +1,5 @@
+include $(BASEDIR)/Rules.mk
+
+obj-y += boot.o
+
+include $(BASEDIR)/Post.mk
diff -r f163677f8767 -r a9f5cf43451f xen/arch/x86/cpu/Makefile
--- /dev/null Tue Mar 21 16:55:44 2006
+++ b/xen/arch/x86/cpu/Makefile Tue Mar 21 18:19:11 2006
@@ -0,0 +1,16 @@
+include $(BASEDIR)/Rules.mk
+
+subdir-y += mcheck
+subdir-y += mtrr
+
+obj-y += amd.o
+obj-y += common.o
+obj-y += intel.o
+obj-y += intel_cacheinfo.o
+
+obj-$(x86_32) += centaur.o
+obj-$(x86_32) += cyrix.o
+obj-$(x86_32) += rise.o
+obj-$(x86_32) += transmeta.o
+
+include $(BASEDIR)/Post.mk
diff -r f163677f8767 -r a9f5cf43451f xen/arch/x86/cpu/mcheck/Makefile
--- /dev/null Tue Mar 21 16:55:44 2006
+++ b/xen/arch/x86/cpu/mcheck/Makefile Tue Mar 21 18:19:11 2006
@@ -0,0 +1,11 @@
+include $(BASEDIR)/Rules.mk
+
+obj-y += k7.o
+obj-y += mce.o
+obj-y += non-fatal.o
+obj-y += p4.o
+obj-y += p5.o
+obj-y += p6.o
+obj-y += winchip.o
+
+include $(BASEDIR)/Post.mk
diff -r f163677f8767 -r a9f5cf43451f xen/arch/x86/cpu/mtrr/Makefile
--- /dev/null Tue Mar 21 16:55:44 2006
+++ b/xen/arch/x86/cpu/mtrr/Makefile Tue Mar 21 18:19:11 2006
@@ -0,0 +1,10 @@
+include $(BASEDIR)/Rules.mk
+
+obj-y += amd.o
+obj-y += centaur.o
+obj-y += cyrix.o
+obj-y += generic.o
+obj-y += main.o
+obj-y += state.o
+
+include $(BASEDIR)/Post.mk
diff -r f163677f8767 -r a9f5cf43451f xen/arch/x86/genapic/Makefile
--- /dev/null Tue Mar 21 16:55:44 2006
+++ b/xen/arch/x86/genapic/Makefile Tue Mar 21 18:19:11 2006
@@ -0,0 +1,10 @@
+include $(BASEDIR)/Rules.mk
+
+obj-y += bigsmp.o
+obj-y += default.o
+obj-y += es7000.o
+obj-y += es7000plat.o
+obj-y += probe.o
+obj-y += summit.o
+
+include $(BASEDIR)/Post.mk
diff -r f163677f8767 -r a9f5cf43451f xen/arch/x86/hvm/Makefile
--- /dev/null Tue Mar 21 16:55:44 2006
+++ b/xen/arch/x86/hvm/Makefile Tue Mar 21 18:19:11 2006
@@ -0,0 +1,14 @@
+include $(BASEDIR)/Rules.mk
+
+subdir-y += svm
+subdir-y += vmx
+
+obj-y += hvm.o
+obj-y += i8259.o
+obj-y += intercept.o
+obj-y += io.o
+obj-y += platform.o
+obj-y += vioapic.o
+obj-y += vlapic.o
+
+include $(BASEDIR)/Post.mk
diff -r f163677f8767 -r a9f5cf43451f xen/arch/x86/hvm/svm/Makefile
--- /dev/null Tue Mar 21 16:55:44 2006
+++ b/xen/arch/x86/hvm/svm/Makefile Tue Mar 21 18:19:11 2006
@@ -0,0 +1,12 @@
+include $(BASEDIR)/Rules.mk
+
+subdir-$(x86_32) += x86_32
+subdir-$(x86_64) += x86_64
+
+obj-y += emulate.o
+obj-y += instrlen.o
+obj-y += intr.o
+obj-y += svm.o
+obj-y += vmcb.o
+
+include $(BASEDIR)/Post.mk
diff -r f163677f8767 -r a9f5cf43451f xen/arch/x86/hvm/svm/x86_32/Makefile
--- /dev/null Tue Mar 21 16:55:44 2006
+++ b/xen/arch/x86/hvm/svm/x86_32/Makefile Tue Mar 21 18:19:11 2006
@@ -0,0 +1,5 @@
+include $(BASEDIR)/Rules.mk
+
+obj-y += exits.o
+
+include $(BASEDIR)/Post.mk
diff -r f163677f8767 -r a9f5cf43451f xen/arch/x86/hvm/svm/x86_64/Makefile
--- /dev/null Tue Mar 21 16:55:44 2006
+++ b/xen/arch/x86/hvm/svm/x86_64/Makefile Tue Mar 21 18:19:11 2006
@@ -0,0 +1,5 @@
+include $(BASEDIR)/Rules.mk
+
+obj-y += exits.o
+
+include $(BASEDIR)/Post.mk
diff -r f163677f8767 -r a9f5cf43451f xen/arch/x86/hvm/vmx/Makefile
--- /dev/null Tue Mar 21 16:55:44 2006
+++ b/xen/arch/x86/hvm/vmx/Makefile Tue Mar 21 18:19:11 2006
@@ -0,0 +1,10 @@
+include $(BASEDIR)/Rules.mk
+
+subdir-$(x86_32) += x86_32
+subdir-$(x86_64) += x86_64
+
+obj-y += io.o
+obj-y += vmcs.o
+obj-y += vmx.o
+
+include $(BASEDIR)/Post.mk
diff -r f163677f8767 -r a9f5cf43451f xen/arch/x86/hvm/vmx/x86_32/Makefile
--- /dev/null Tue Mar 21 16:55:44 2006
+++ b/xen/arch/x86/hvm/vmx/x86_32/Makefile Tue Mar 21 18:19:11 2006
@@ -0,0 +1,5 @@
+include $(BASEDIR)/Rules.mk
+
+obj-y += exits.o
+
+include $(BASEDIR)/Post.mk
diff -r f163677f8767 -r a9f5cf43451f xen/arch/x86/hvm/vmx/x86_64/Makefile
--- /dev/null Tue Mar 21 16:55:44 2006
+++ b/xen/arch/x86/hvm/vmx/x86_64/Makefile Tue Mar 21 18:19:11 2006
@@ -0,0 +1,5 @@
+include $(BASEDIR)/Rules.mk
+
+obj-y += exits.o
+
+include $(BASEDIR)/Post.mk
diff -r f163677f8767 -r a9f5cf43451f xen/arch/x86/x86_32/Makefile
--- /dev/null Tue Mar 21 16:55:44 2006
+++ b/xen/arch/x86/x86_32/Makefile Tue Mar 21 18:19:11 2006
@@ -0,0 +1,11 @@
+include $(BASEDIR)/Rules.mk
+
+obj-y += domain_page.o
+obj-y += entry.o
+obj-y += mm.o
+obj-y += seg_fixup.o
+obj-y += traps.o
+
+obj-$(supervisor_mode_kernel) += supervisor_mode_kernel.o
+
+include $(BASEDIR)/Post.mk
diff -r f163677f8767 -r a9f5cf43451f xen/arch/x86/x86_64/Makefile
--- /dev/null Tue Mar 21 16:55:44 2006
+++ b/xen/arch/x86/x86_64/Makefile Tue Mar 21 18:19:11 2006
@@ -0,0 +1,7 @@
+include $(BASEDIR)/Rules.mk
+
+obj-y += entry.o
+obj-y += mm.o
+obj-y += traps.o
+
+include $(BASEDIR)/Post.mk
diff -r f163677f8767 -r a9f5cf43451f
patches/linux-2.6.16-rc5/i386-mach-io-check-nmi.patch
--- a/patches/linux-2.6.16-rc5/i386-mach-io-check-nmi.patch Tue Mar 21
16:55:44 2006
+++ /dev/null Tue Mar 21 18:19:11 2006
@@ -1,45 +0,0 @@
-diff -pruN ../pristine-linux-2.6.16-rc5/arch/i386/kernel/traps.c
./arch/i386/kernel/traps.c
---- ../pristine-linux-2.6.16-rc5/arch/i386/kernel/traps.c 2006-02-27
15:46:58.000000000 +0000
-+++ ./arch/i386/kernel/traps.c 2006-02-27 15:55:23.000000000 +0000
-@@ -567,18 +567,11 @@ static void mem_parity_error(unsigned ch
-
- static void io_check_error(unsigned char reason, struct pt_regs * regs)
- {
-- unsigned long i;
--
- printk(KERN_EMERG "NMI: IOCK error (debug interrupt?)\n");
- show_registers(regs);
-
- /* Re-enable the IOCK line, wait for a few seconds */
-- reason = (reason & 0xf) | 8;
-- outb(reason, 0x61);
-- i = 2000;
-- while (--i) udelay(1000);
-- reason &= ~8;
-- outb(reason, 0x61);
-+ clear_io_check_error(reason);
- }
-
- static void unknown_nmi_error(unsigned char reason, struct pt_regs * regs)
-diff -pruN
../pristine-linux-2.6.16-rc5/include/asm-i386/mach-default/mach_traps.h
./include/asm-i386/mach-default/mach_traps.h
---- ../pristine-linux-2.6.16-rc5/include/asm-i386/mach-default/mach_traps.h
2006-01-03 03:21:10.000000000 +0000
-+++ ./include/asm-i386/mach-default/mach_traps.h 2006-02-27
15:55:23.000000000 +0000
-@@ -15,6 +15,18 @@ static inline void clear_mem_error(unsig
- outb(reason, 0x61);
- }
-
-+static inline void clear_io_check_error(unsigned char reason)
-+{
-+ unsigned long i;
-+
-+ reason = (reason & 0xf) | 8;
-+ outb(reason, 0x61);
-+ i = 2000;
-+ while (--i) udelay(1000);
-+ reason &= ~8;
-+ outb(reason, 0x61);
-+}
-+
- static inline unsigned char get_nmi_reason(void)
- {
- return inb(0x61);
diff -r f163677f8767 -r a9f5cf43451f patches/linux-2.6.16-rc5/net-csum.patch
--- a/patches/linux-2.6.16-rc5/net-csum.patch Tue Mar 21 16:55:44 2006
+++ /dev/null Tue Mar 21 18:19:11 2006
@@ -1,41 +0,0 @@
-diff -pruN ../pristine-linux-2.6.16-rc5/net/ipv4/netfilter/ip_nat_proto_tcp.c
./net/ipv4/netfilter/ip_nat_proto_tcp.c
---- ../pristine-linux-2.6.16-rc5/net/ipv4/netfilter/ip_nat_proto_tcp.c
2006-02-27 15:47:38.000000000 +0000
-+++ ./net/ipv4/netfilter/ip_nat_proto_tcp.c 2006-02-27 15:55:25.000000000
+0000
-@@ -129,10 +129,14 @@ tcp_manip_pkt(struct sk_buff **pskb,
- if (hdrsize < sizeof(*hdr))
- return 1;
-
-- hdr->check = ip_nat_cheat_check(~oldip, newip,
-+ if ((*pskb)->proto_csum_blank) {
-+ hdr->check = ip_nat_cheat_check(oldip, ~newip, hdr->check);
-+ } else {
-+ hdr->check = ip_nat_cheat_check(~oldip, newip,
- ip_nat_cheat_check(oldport ^ 0xFFFF,
- newport,
- hdr->check));
-+ }
- return 1;
- }
-
-diff -pruN ../pristine-linux-2.6.16-rc5/net/ipv4/netfilter/ip_nat_proto_udp.c
./net/ipv4/netfilter/ip_nat_proto_udp.c
---- ../pristine-linux-2.6.16-rc5/net/ipv4/netfilter/ip_nat_proto_udp.c
2006-02-27 15:47:38.000000000 +0000
-+++ ./net/ipv4/netfilter/ip_nat_proto_udp.c 2006-02-27 15:55:25.000000000
+0000
-@@ -113,11 +113,16 @@ udp_manip_pkt(struct sk_buff **pskb,
- newport = tuple->dst.u.udp.port;
- portptr = &hdr->dest;
- }
-- if (hdr->check) /* 0 is a special case meaning no checksum */
-- hdr->check = ip_nat_cheat_check(~oldip, newip,
-+ if (hdr->check) { /* 0 is a special case meaning no checksum */
-+ if ((*pskb)->proto_csum_blank) {
-+ hdr->check = ip_nat_cheat_check(oldip, ~newip,
hdr->check);
-+ } else {
-+ hdr->check = ip_nat_cheat_check(~oldip, newip,
- ip_nat_cheat_check(*portptr ^ 0xFFFF,
- newport,
- hdr->check));
-+ }
-+ }
- *portptr = newport;
- return 1;
- }
diff -r f163677f8767 -r a9f5cf43451f patches/linux-2.6.16-rc5/pmd-shared.patch
--- a/patches/linux-2.6.16-rc5/pmd-shared.patch Tue Mar 21 16:55:44 2006
+++ /dev/null Tue Mar 21 18:19:11 2006
@@ -1,111 +0,0 @@
-diff -pruN ../pristine-linux-2.6.16-rc5/arch/i386/mm/pageattr.c
./arch/i386/mm/pageattr.c
---- ../pristine-linux-2.6.16-rc5/arch/i386/mm/pageattr.c 2006-02-27
15:46:58.000000000 +0000
-+++ ./arch/i386/mm/pageattr.c 2006-02-27 15:55:31.000000000 +0000
-@@ -78,7 +78,7 @@ static void set_pmd_pte(pte_t *kpte, uns
- unsigned long flags;
-
- set_pte_atomic(kpte, pte); /* change init_mm */
-- if (PTRS_PER_PMD > 1)
-+ if (HAVE_SHARED_KERNEL_PMD)
- return;
-
- spin_lock_irqsave(&pgd_lock, flags);
-diff -pruN ../pristine-linux-2.6.16-rc5/arch/i386/mm/pgtable.c
./arch/i386/mm/pgtable.c
---- ../pristine-linux-2.6.16-rc5/arch/i386/mm/pgtable.c 2006-01-03
03:21:10.000000000 +0000
-+++ ./arch/i386/mm/pgtable.c 2006-02-27 15:55:31.000000000 +0000
-@@ -215,9 +215,10 @@ void pgd_ctor(void *pgd, kmem_cache_t *c
- spin_lock_irqsave(&pgd_lock, flags);
- }
-
-- clone_pgd_range((pgd_t *)pgd + USER_PTRS_PER_PGD,
-- swapper_pg_dir + USER_PTRS_PER_PGD,
-- KERNEL_PGD_PTRS);
-+ if (PTRS_PER_PMD == 1 || HAVE_SHARED_KERNEL_PMD)
-+ clone_pgd_range((pgd_t *)pgd + USER_PTRS_PER_PGD,
-+ swapper_pg_dir + USER_PTRS_PER_PGD,
-+ KERNEL_PGD_PTRS);
- if (PTRS_PER_PMD > 1)
- return;
-
-@@ -249,6 +250,30 @@ pgd_t *pgd_alloc(struct mm_struct *mm)
- goto out_oom;
- set_pgd(&pgd[i], __pgd(1 + __pa(pmd)));
- }
-+
-+ if (!HAVE_SHARED_KERNEL_PMD) {
-+ unsigned long flags;
-+
-+ for (i = USER_PTRS_PER_PGD; i < PTRS_PER_PGD; i++) {
-+ pmd_t *pmd = kmem_cache_alloc(pmd_cache, GFP_KERNEL);
-+ if (!pmd)
-+ goto out_oom;
-+ set_pgd(&pgd[USER_PTRS_PER_PGD], __pgd(1 + __pa(pmd)));
-+ }
-+
-+ spin_lock_irqsave(&pgd_lock, flags);
-+ for (i = USER_PTRS_PER_PGD; i < PTRS_PER_PGD; i++) {
-+ unsigned long v = (unsigned long)i << PGDIR_SHIFT;
-+ pgd_t *kpgd = pgd_offset_k(v);
-+ pud_t *kpud = pud_offset(kpgd, v);
-+ pmd_t *kpmd = pmd_offset(kpud, v);
-+ pmd_t *pmd = (void *)__va(pgd_val(pgd[i])-1);
-+ memcpy(pmd, kpmd, PAGE_SIZE);
-+ }
-+ pgd_list_add(pgd);
-+ spin_unlock_irqrestore(&pgd_lock, flags);
-+ }
-+
- return pgd;
-
- out_oom:
-@@ -263,9 +288,23 @@ void pgd_free(pgd_t *pgd)
- int i;
-
- /* in the PAE case user pgd entries are overwritten before usage */
-- if (PTRS_PER_PMD > 1)
-- for (i = 0; i < USER_PTRS_PER_PGD; ++i)
-- kmem_cache_free(pmd_cache, (void
*)__va(pgd_val(pgd[i])-1));
-+ if (PTRS_PER_PMD > 1) {
-+ for (i = 0; i < USER_PTRS_PER_PGD; ++i) {
-+ pmd_t *pmd = (void *)__va(pgd_val(pgd[i])-1);
-+ kmem_cache_free(pmd_cache, pmd);
-+ }
-+ if (!HAVE_SHARED_KERNEL_PMD) {
-+ unsigned long flags;
-+ spin_lock_irqsave(&pgd_lock, flags);
-+ pgd_list_del(pgd);
-+ spin_unlock_irqrestore(&pgd_lock, flags);
-+ for (i = USER_PTRS_PER_PGD; i < PTRS_PER_PGD; i++) {
-+ pmd_t *pmd = (void *)__va(pgd_val(pgd[i])-1);
-+ memset(pmd, 0, PTRS_PER_PMD*sizeof(pmd_t));
-+ kmem_cache_free(pmd_cache, pmd);
-+ }
-+ }
-+ }
- /* in the non-PAE case, free_pgtables() clears user pgd entries */
- kmem_cache_free(pgd_cache, pgd);
- }
-diff -pruN ../pristine-linux-2.6.16-rc5/include/asm-i386/pgtable-2level-defs.h
./include/asm-i386/pgtable-2level-defs.h
---- ../pristine-linux-2.6.16-rc5/include/asm-i386/pgtable-2level-defs.h
2006-01-03 03:21:10.000000000 +0000
-+++ ./include/asm-i386/pgtable-2level-defs.h 2006-02-27 15:55:31.000000000
+0000
-@@ -1,6 +1,8 @@
- #ifndef _I386_PGTABLE_2LEVEL_DEFS_H
- #define _I386_PGTABLE_2LEVEL_DEFS_H
-
-+#define HAVE_SHARED_KERNEL_PMD 0
-+
- /*
- * traditional i386 two-level paging structure:
- */
-diff -pruN ../pristine-linux-2.6.16-rc5/include/asm-i386/pgtable-3level-defs.h
./include/asm-i386/pgtable-3level-defs.h
---- ../pristine-linux-2.6.16-rc5/include/asm-i386/pgtable-3level-defs.h
2006-01-03 03:21:10.000000000 +0000
-+++ ./include/asm-i386/pgtable-3level-defs.h 2006-02-27 15:55:31.000000000
+0000
-@@ -1,6 +1,8 @@
- #ifndef _I386_PGTABLE_3LEVEL_DEFS_H
- #define _I386_PGTABLE_3LEVEL_DEFS_H
-
-+#define HAVE_SHARED_KERNEL_PMD 1
-+
- /*
- * PGDIR_SHIFT determines what a top-level page table entry can map
- */
diff -r f163677f8767 -r a9f5cf43451f patches/linux-2.6.16-rc5/smp-alts.patch
--- a/patches/linux-2.6.16-rc5/smp-alts.patch Tue Mar 21 16:55:44 2006
+++ /dev/null Tue Mar 21 18:19:11 2006
@@ -1,591 +0,0 @@
-diff -pruN ../pristine-linux-2.6.16-rc5/arch/i386/Kconfig ./arch/i386/Kconfig
---- ../pristine-linux-2.6.16-rc5/arch/i386/Kconfig 2006-02-27
15:46:58.000000000 +0000
-+++ ./arch/i386/Kconfig 2006-02-27 15:55:34.000000000 +0000
-@@ -202,6 +202,19 @@ config SMP
-
- If you don't know what to do here, say N.
-
-+config SMP_ALTERNATIVES
-+ bool "SMP alternatives support (EXPERIMENTAL)"
-+ depends on SMP && EXPERIMENTAL
-+ help
-+ Try to reduce the overhead of running an SMP kernel on a uniprocessor
-+ host slightly by replacing certain key instruction sequences
-+ according to whether we currently have more than one CPU available.
-+ This should provide a noticeable boost to performance when
-+ running SMP kernels on UP machines, and have negligible impact
-+ when running on an true SMP host.
-+
-+ If unsure, say N.
-+
- config NR_CPUS
- int "Maximum number of CPUs (2-255)"
- range 2 255
-diff -pruN ../pristine-linux-2.6.16-rc5/arch/i386/kernel/Makefile
./arch/i386/kernel/Makefile
---- ../pristine-linux-2.6.16-rc5/arch/i386/kernel/Makefile 2006-02-27
15:46:58.000000000 +0000
-+++ ./arch/i386/kernel/Makefile 2006-02-27 15:55:34.000000000 +0000
-@@ -37,6 +37,7 @@ obj-$(CONFIG_EFI) += efi.o efi_stub.o
- obj-$(CONFIG_DOUBLEFAULT) += doublefault.o
- obj-$(CONFIG_VM86) += vm86.o
- obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
-+obj-$(CONFIG_SMP_ALTERNATIVES) += smpalts.o
-
- EXTRA_AFLAGS := -traditional
-
-diff -pruN ../pristine-linux-2.6.16-rc5/arch/i386/kernel/smpalts.c
./arch/i386/kernel/smpalts.c
---- ../pristine-linux-2.6.16-rc5/arch/i386/kernel/smpalts.c 1970-01-01
01:00:00.000000000 +0100
-+++ ./arch/i386/kernel/smpalts.c 2006-02-27 15:55:34.000000000 +0000
-@@ -0,0 +1,85 @@
-+#include <linux/kernel.h>
-+#include <asm/system.h>
-+#include <asm/smp_alt.h>
-+#include <asm/processor.h>
-+#include <asm/string.h>
-+
-+struct smp_replacement_record {
-+ unsigned char targ_size;
-+ unsigned char smp1_size;
-+ unsigned char smp2_size;
-+ unsigned char up_size;
-+ unsigned char feature;
-+ unsigned char data[0];
-+};
-+
-+struct smp_alternative_record {
-+ void *targ_start;
-+ struct smp_replacement_record *repl;
-+};
-+
-+extern struct smp_alternative_record __start_smp_alternatives_table,
-+ __stop_smp_alternatives_table;
-+extern unsigned long __init_begin, __init_end;
-+
-+void prepare_for_smp(void)
-+{
-+ struct smp_alternative_record *r;
-+ printk(KERN_INFO "Enabling SMP...\n");
-+ for (r = &__start_smp_alternatives_table;
-+ r != &__stop_smp_alternatives_table;
-+ r++) {
-+ BUG_ON(r->repl->targ_size < r->repl->smp1_size);
-+ BUG_ON(r->repl->targ_size < r->repl->smp2_size);
-+ BUG_ON(r->repl->targ_size < r->repl->up_size);
-+ if (system_state == SYSTEM_RUNNING &&
-+ r->targ_start >= (void *)&__init_begin &&
-+ r->targ_start < (void *)&__init_end)
-+ continue;
-+ if (r->repl->feature != (unsigned char)-1 &&
-+ boot_cpu_has(r->repl->feature)) {
-+ memcpy(r->targ_start,
-+ r->repl->data + r->repl->smp1_size,
-+ r->repl->smp2_size);
-+ memset(r->targ_start + r->repl->smp2_size,
-+ 0x90,
-+ r->repl->targ_size - r->repl->smp2_size);
-+ } else {
-+ memcpy(r->targ_start,
-+ r->repl->data,
-+ r->repl->smp1_size);
-+ memset(r->targ_start + r->repl->smp1_size,
-+ 0x90,
-+ r->repl->targ_size - r->repl->smp1_size);
-+ }
-+ }
-+ /* Paranoia */
-+ asm volatile ("jmp 1f\n1:");
-+ mb();
-+}
-+
-+void unprepare_for_smp(void)
-+{
-+ struct smp_alternative_record *r;
-+ printk(KERN_INFO "Disabling SMP...\n");
-+ for (r = &__start_smp_alternatives_table;
-+ r != &__stop_smp_alternatives_table;
-+ r++) {
-+ BUG_ON(r->repl->targ_size < r->repl->smp1_size);
-+ BUG_ON(r->repl->targ_size < r->repl->smp2_size);
-+ BUG_ON(r->repl->targ_size < r->repl->up_size);
-+ if (system_state == SYSTEM_RUNNING &&
-+ r->targ_start >= (void *)&__init_begin &&
-+ r->targ_start < (void *)&__init_end)
-+ continue;
-+ memcpy(r->targ_start,
-+ r->repl->data + r->repl->smp1_size + r->repl->smp2_size,
-+ r->repl->up_size);
-+ memset(r->targ_start + r->repl->up_size,
-+ 0x90,
-+ r->repl->targ_size - r->repl->up_size);
-+ }
-+ /* Paranoia */
-+ asm volatile ("jmp 1f\n1:");
-+ mb();
-+}
-diff -pruN ../pristine-linux-2.6.16-rc5/arch/i386/kernel/smpboot.c
./arch/i386/kernel/smpboot.c
---- ../pristine-linux-2.6.16-rc5/arch/i386/kernel/smpboot.c 2006-02-27
15:46:58.000000000 +0000
-+++ ./arch/i386/kernel/smpboot.c 2006-02-27 15:55:34.000000000 +0000
-@@ -1208,6 +1208,11 @@ static void __init smp_boot_cpus(unsigne
- if (max_cpus <= cpucount+1)
- continue;
-
-+#ifdef CONFIG_SMP_ALTERNATIVES
-+ if (kicked == 1)
-+ prepare_for_smp();
-+#endif
-+
- if (((cpu = alloc_cpu_id()) <= 0) || do_boot_cpu(apicid, cpu))
- printk("CPU #%d not responding - cannot use it.\n",
- apicid);
-@@ -1386,6 +1391,11 @@ int __devinit __cpu_up(unsigned int cpu)
- return -EIO;
- }
-
-+#ifdef CONFIG_SMP_ALTERNATIVES
-+ if (num_online_cpus() == 1)
-+ prepare_for_smp();
-+#endif
-+
- local_irq_enable();
- per_cpu(cpu_state, cpu) = CPU_UP_PREPARE;
- /* Unleash the CPU! */
-diff -pruN ../pristine-linux-2.6.16-rc5/arch/i386/kernel/vmlinux.lds.S
./arch/i386/kernel/vmlinux.lds.S
---- ../pristine-linux-2.6.16-rc5/arch/i386/kernel/vmlinux.lds.S
2006-01-03 03:21:10.000000000 +0000
-+++ ./arch/i386/kernel/vmlinux.lds.S 2006-02-27 15:55:34.000000000 +0000
-@@ -34,6 +34,13 @@ SECTIONS
- __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) { *(__ex_table) }
- __stop___ex_table = .;
-
-+ . = ALIGN(16);
-+ __start_smp_alternatives_table = .;
-+ __smp_alternatives : { *(__smp_alternatives) }
-+ __stop_smp_alternatives_table = .;
-+
-+ __smp_replacements : { *(__smp_replacements) }
-+
- RODATA
-
- /* writeable */
-diff -pruN ../pristine-linux-2.6.16-rc5/include/asm-i386/atomic.h
./include/asm-i386/atomic.h
---- ../pristine-linux-2.6.16-rc5/include/asm-i386/atomic.h 2006-02-27
15:47:25.000000000 +0000
-+++ ./include/asm-i386/atomic.h 2006-02-27 15:55:34.000000000 +0000
-@@ -4,18 +4,13 @@
- #include <linux/config.h>
- #include <linux/compiler.h>
- #include <asm/processor.h>
-+#include <asm/smp_alt.h>
-
- /*
- * Atomic operations that C can't guarantee us. Useful for
- * resource counting etc..
- */
-
--#ifdef CONFIG_SMP
--#define LOCK "lock ; "
--#else
--#define LOCK ""
--#endif
--
- /*
- * Make sure gcc doesn't try to be clever and move things around
- * on us. We need to use _exactly_ the address the user gave us,
-diff -pruN ../pristine-linux-2.6.16-rc5/include/asm-i386/bitops.h
./include/asm-i386/bitops.h
---- ../pristine-linux-2.6.16-rc5/include/asm-i386/bitops.h 2006-02-27
15:47:25.000000000 +0000
-+++ ./include/asm-i386/bitops.h 2006-02-27 15:55:34.000000000 +0000
-@@ -7,6 +7,7 @@
-
- #include <linux/config.h>
- #include <linux/compiler.h>
-+#include <asm/smp_alt.h>
-
- /*
- * These have to be done with inline assembly: that way the bit-setting
-@@ -16,12 +17,6 @@
- * bit 0 is the LSB of addr; bit 32 is the LSB of (addr+1).
- */
-
--#ifdef CONFIG_SMP
--#define LOCK_PREFIX "lock ; "
--#else
--#define LOCK_PREFIX ""
--#endif
--
- #define ADDR (*(volatile long *) addr)
-
- /**
-@@ -41,7 +36,7 @@
- */
- static inline void set_bit(int nr, volatile unsigned long * addr)
- {
-- __asm__ __volatile__( LOCK_PREFIX
-+ __asm__ __volatile__( LOCK
- "btsl %1,%0"
- :"+m" (ADDR)
- :"Ir" (nr));
-@@ -76,7 +71,7 @@ static inline void __set_bit(int nr, vol
- */
- static inline void clear_bit(int nr, volatile unsigned long * addr)
- {
-- __asm__ __volatile__( LOCK_PREFIX
-+ __asm__ __volatile__( LOCK
- "btrl %1,%0"
- :"+m" (ADDR)
- :"Ir" (nr));
-@@ -121,7 +116,7 @@ static inline void __change_bit(int nr,
- */
- static inline void change_bit(int nr, volatile unsigned long * addr)
- {
-- __asm__ __volatile__( LOCK_PREFIX
-+ __asm__ __volatile__( LOCK
- "btcl %1,%0"
- :"+m" (ADDR)
- :"Ir" (nr));
-@@ -140,7 +135,7 @@ static inline int test_and_set_bit(int n
- {
- int oldbit;
-
-- __asm__ __volatile__( LOCK_PREFIX
-+ __asm__ __volatile__( LOCK
- "btsl %2,%1\n\tsbbl %0,%0"
- :"=r" (oldbit),"+m" (ADDR)
- :"Ir" (nr) : "memory");
-@@ -180,7 +175,7 @@ static inline int test_and_clear_bit(int
- {
- int oldbit;
-
-- __asm__ __volatile__( LOCK_PREFIX
-+ __asm__ __volatile__( LOCK
- "btrl %2,%1\n\tsbbl %0,%0"
- :"=r" (oldbit),"+m" (ADDR)
- :"Ir" (nr) : "memory");
-@@ -231,7 +226,7 @@ static inline int test_and_change_bit(in
- {
- int oldbit;
-
-- __asm__ __volatile__( LOCK_PREFIX
-+ __asm__ __volatile__( LOCK
- "btcl %2,%1\n\tsbbl %0,%0"
- :"=r" (oldbit),"+m" (ADDR)
- :"Ir" (nr) : "memory");
-diff -pruN ../pristine-linux-2.6.16-rc5/include/asm-i386/futex.h
./include/asm-i386/futex.h
---- ../pristine-linux-2.6.16-rc5/include/asm-i386/futex.h 2006-02-27
15:47:25.000000000 +0000
-+++ ./include/asm-i386/futex.h 2006-02-27 15:55:34.000000000 +0000
-@@ -28,7 +28,7 @@
- "1: movl %2, %0\n\
- movl %0, %3\n" \
- insn "\n" \
--"2: " LOCK_PREFIX "cmpxchgl %3, %2\n\
-+"2: " LOCK "cmpxchgl %3, %2\n\
- jnz 1b\n\
- 3: .section .fixup,\"ax\"\n\
- 4: mov %5, %1\n\
-@@ -68,7 +68,7 @@ futex_atomic_op_inuser (int encoded_op,
- #endif
- switch (op) {
- case FUTEX_OP_ADD:
-- __futex_atomic_op1(LOCK_PREFIX "xaddl %0, %2", ret,
-+ __futex_atomic_op1(LOCK "xaddl %0, %2", ret,
- oldval, uaddr, oparg);
- break;
- case FUTEX_OP_OR:
-diff -pruN ../pristine-linux-2.6.16-rc5/include/asm-i386/rwsem.h
./include/asm-i386/rwsem.h
---- ../pristine-linux-2.6.16-rc5/include/asm-i386/rwsem.h 2006-01-03
03:21:10.000000000 +0000
-+++ ./include/asm-i386/rwsem.h 2006-02-27 15:55:34.000000000 +0000
-@@ -40,6 +40,7 @@
-
- #include <linux/list.h>
- #include <linux/spinlock.h>
-+#include <asm/smp_alt.h>
-
- struct rwsem_waiter;
-
-@@ -99,7 +100,7 @@ static inline void __down_read(struct rw
- {
- __asm__ __volatile__(
- "# beginning down_read\n\t"
--LOCK_PREFIX " incl (%%eax)\n\t" /* adds 0x00000001, returns the old
value */
-+LOCK " incl (%%eax)\n\t" /* adds 0x00000001, returns the old
value */
- " js 2f\n\t" /* jump if we weren't granted the lock */
- "1:\n\t"
- LOCK_SECTION_START("")
-@@ -130,7 +131,7 @@ static inline int __down_read_trylock(st
- " movl %1,%2\n\t"
- " addl %3,%2\n\t"
- " jle 2f\n\t"
--LOCK_PREFIX " cmpxchgl %2,%0\n\t"
-+LOCK " cmpxchgl %2,%0\n\t"
- " jnz 1b\n\t"
- "2:\n\t"
- "# ending __down_read_trylock\n\t"
-@@ -150,7 +151,7 @@ static inline void __down_write(struct r
- tmp = RWSEM_ACTIVE_WRITE_BIAS;
- __asm__ __volatile__(
- "# beginning down_write\n\t"
--LOCK_PREFIX " xadd %%edx,(%%eax)\n\t" /* subtract 0x0000ffff, returns
the old value */
-+LOCK " xadd %%edx,(%%eax)\n\t" /* subtract 0x0000ffff, returns
the old value */
- " testl %%edx,%%edx\n\t" /* was the count 0 before? */
- " jnz 2f\n\t" /* jump if we weren't granted the lock */
- "1:\n\t"
-@@ -188,7 +189,7 @@ static inline void __up_read(struct rw_s
- __s32 tmp = -RWSEM_ACTIVE_READ_BIAS;
- __asm__ __volatile__(
- "# beginning __up_read\n\t"
--LOCK_PREFIX " xadd %%edx,(%%eax)\n\t" /* subtracts 1, returns the old
value */
-+LOCK " xadd %%edx,(%%eax)\n\t" /* subtracts 1, returns the old
value */
- " js 2f\n\t" /* jump if the lock is being waited upon */
- "1:\n\t"
- LOCK_SECTION_START("")
-@@ -214,7 +215,7 @@ static inline void __up_write(struct rw_
- __asm__ __volatile__(
- "# beginning __up_write\n\t"
- " movl %2,%%edx\n\t"
--LOCK_PREFIX " xaddl %%edx,(%%eax)\n\t" /* tries to transition
0xffff0001 -> 0x00000000 */
-+LOCK " xaddl %%edx,(%%eax)\n\t" /* tries to transition
0xffff0001 -> 0x00000000 */
- " jnz 2f\n\t" /* jump if the lock is being waited upon */
- "1:\n\t"
- LOCK_SECTION_START("")
-@@ -239,7 +240,7 @@ static inline void __downgrade_write(str
- {
- __asm__ __volatile__(
- "# beginning __downgrade_write\n\t"
--LOCK_PREFIX " addl %2,(%%eax)\n\t" /* transitions 0xZZZZ0001 ->
0xYYYY0001 */
-+LOCK " addl %2,(%%eax)\n\t" /* transitions 0xZZZZ0001 ->
0xYYYY0001 */
- " js 2f\n\t" /* jump if the lock is being waited upon */
- "1:\n\t"
- LOCK_SECTION_START("")
-@@ -263,7 +264,7 @@ LOCK_PREFIX " addl %2,(%%eax)\n\t"
- static inline void rwsem_atomic_add(int delta, struct rw_semaphore *sem)
- {
- __asm__ __volatile__(
--LOCK_PREFIX "addl %1,%0"
-+LOCK "addl %1,%0"
- : "=m"(sem->count)
- : "ir"(delta), "m"(sem->count));
- }
-@@ -276,7 +277,7 @@ static inline int rwsem_atomic_update(in
- int tmp = delta;
-
- __asm__ __volatile__(
--LOCK_PREFIX "xadd %0,(%2)"
-+LOCK "xadd %0,(%2)"
- : "+r"(tmp), "=m"(sem->count)
- : "r"(sem), "m"(sem->count)
- : "memory");
-diff -pruN ../pristine-linux-2.6.16-rc5/include/asm-i386/smp_alt.h
./include/asm-i386/smp_alt.h
---- ../pristine-linux-2.6.16-rc5/include/asm-i386/smp_alt.h 1970-01-01
01:00:00.000000000 +0100
-+++ ./include/asm-i386/smp_alt.h 2006-02-27 15:55:34.000000000 +0000
-@@ -0,0 +1,32 @@
-+#ifndef __ASM_SMP_ALT_H__
-+#define __ASM_SMP_ALT_H__
-+
-+#include <linux/config.h>
-+
-+#ifdef CONFIG_SMP
-+#if defined(CONFIG_SMP_ALTERNATIVES) && !defined(MODULE)
-+#define LOCK \
-+ "6677: nop\n" \
-+ ".section __smp_alternatives,\"a\"\n" \
-+ ".long 6677b\n" \
-+ ".long 6678f\n" \
-+ ".previous\n" \
-+ ".section __smp_replacements,\"a\"\n" \
-+ "6678: .byte 1\n" \
-+ ".byte 1\n" \
-+ ".byte 0\n" \
-+ ".byte 1\n" \
-+ ".byte -1\n" \
-+ "lock\n" \
-+ "nop\n" \
-+ ".previous\n"
-+void prepare_for_smp(void);
-+void unprepare_for_smp(void);
-+#else
-+#define LOCK "lock ; "
-+#endif
-+#else
-+#define LOCK ""
-+#endif
-+
-+#endif /* __ASM_SMP_ALT_H__ */
-diff -pruN ../pristine-linux-2.6.16-rc5/include/asm-i386/spinlock.h
./include/asm-i386/spinlock.h
---- ../pristine-linux-2.6.16-rc5/include/asm-i386/spinlock.h 2006-01-03
03:21:10.000000000 +0000
-+++ ./include/asm-i386/spinlock.h 2006-02-27 15:55:34.000000000 +0000
-@@ -6,6 +6,7 @@
- #include <asm/page.h>
- #include <linux/config.h>
- #include <linux/compiler.h>
-+#include <asm/smp_alt.h>
-
- /*
- * Your basic SMP spinlocks, allowing only a single CPU anywhere
-@@ -23,7 +24,8 @@
-
- #define __raw_spin_lock_string \
- "\n1:\t" \
-- "lock ; decb %0\n\t" \
-+ LOCK \
-+ "decb %0\n\t" \
- "jns 3f\n" \
- "2:\t" \
- "rep;nop\n\t" \
-@@ -34,7 +36,8 @@
-
- #define __raw_spin_lock_string_flags \
- "\n1:\t" \
-- "lock ; decb %0\n\t" \
-+ LOCK \
-+ "decb %0\n\t" \
- "jns 4f\n\t" \
- "2:\t" \
- "testl $0x200, %1\n\t" \
-@@ -65,10 +68,34 @@ static inline void __raw_spin_lock_flags
- static inline int __raw_spin_trylock(raw_spinlock_t *lock)
- {
- char oldval;
-+#ifdef CONFIG_SMP_ALTERNATIVES
- __asm__ __volatile__(
-- "xchgb %b0,%1"
-+ "1:movb %1,%b0\n"
-+ "movb $0,%1\n"
-+ "2:"
-+ ".section __smp_alternatives,\"a\"\n"
-+ ".long 1b\n"
-+ ".long 3f\n"
-+ ".previous\n"
-+ ".section __smp_replacements,\"a\"\n"
-+ "3: .byte 2b - 1b\n"
-+ ".byte 5f-4f\n"
-+ ".byte 0\n"
-+ ".byte 6f-5f\n"
-+ ".byte -1\n"
-+ "4: xchgb %b0,%1\n"
-+ "5: movb %1,%b0\n"
-+ "movb $0,%1\n"
-+ "6:\n"
-+ ".previous\n"
- :"=q" (oldval), "=m" (lock->slock)
- :"0" (0) : "memory");
-+#else
-+ __asm__ __volatile__(
-+ "xchgb %b0,%1\n"
-+ :"=q" (oldval), "=m" (lock->slock)
-+ :"0" (0) : "memory");
-+#endif
- return oldval > 0;
- }
-
-@@ -178,12 +205,12 @@ static inline int __raw_write_trylock(ra
-
- static inline void __raw_read_unlock(raw_rwlock_t *rw)
- {
-- asm volatile("lock ; incl %0" :"=m" (rw->lock) : : "memory");
-+ asm volatile(LOCK "incl %0" :"=m" (rw->lock) : : "memory");
- }
-
- static inline void __raw_write_unlock(raw_rwlock_t *rw)
- {
-- asm volatile("lock ; addl $" RW_LOCK_BIAS_STR ", %0"
-+ asm volatile(LOCK "addl $" RW_LOCK_BIAS_STR ", %0"
- : "=m" (rw->lock) : : "memory");
- }
-
-diff -pruN ../pristine-linux-2.6.16-rc5/include/asm-i386/system.h
./include/asm-i386/system.h
---- ../pristine-linux-2.6.16-rc5/include/asm-i386/system.h 2006-02-27
15:47:25.000000000 +0000
-+++ ./include/asm-i386/system.h 2006-02-27 15:55:34.000000000 +0000
-@@ -5,7 +5,7 @@
- #include <linux/kernel.h>
- #include <asm/segment.h>
- #include <asm/cpufeature.h>
--#include <linux/bitops.h> /* for LOCK_PREFIX */
-+#include <asm/smp_alt.h>
-
- #ifdef __KERNEL__
-
-@@ -271,19 +271,19 @@ static inline unsigned long __cmpxchg(vo
- unsigned long prev;
- switch (size) {
- case 1:
-- __asm__ __volatile__(LOCK_PREFIX "cmpxchgb %b1,%2"
-+ __asm__ __volatile__(LOCK "cmpxchgb %b1,%2"
- : "=a"(prev)
- : "q"(new), "m"(*__xg(ptr)), "0"(old)
- : "memory");
- return prev;
- case 2:
-- __asm__ __volatile__(LOCK_PREFIX "cmpxchgw %w1,%2"
-+ __asm__ __volatile__(LOCK "cmpxchgw %w1,%2"
- : "=a"(prev)
- : "r"(new), "m"(*__xg(ptr)), "0"(old)
- : "memory");
- return prev;
- case 4:
-- __asm__ __volatile__(LOCK_PREFIX "cmpxchgl %1,%2"
-+ __asm__ __volatile__(LOCK "cmpxchgl %1,%2"
- : "=a"(prev)
- : "r"(new), "m"(*__xg(ptr)), "0"(old)
- : "memory");
-@@ -336,7 +336,7 @@ static inline unsigned long long __cmpxc
- unsigned long long new)
- {
- unsigned long long prev;
-- __asm__ __volatile__(LOCK_PREFIX "cmpxchg8b %3"
-+ __asm__ __volatile__(LOCK "cmpxchg8b %3"
- : "=A"(prev)
- : "b"((unsigned long)new),
- "c"((unsigned long)(new >> 32)),
-@@ -503,11 +503,55 @@ struct alt_instr {
- #endif
-
- #ifdef CONFIG_SMP
-+#if defined(CONFIG_SMP_ALTERNATIVES) && !defined(MODULE)
-+#define smp_alt_mb(instr) \
-+__asm__ __volatile__("6667:\nnop\nnop\nnop\nnop\nnop\nnop\n6668:\n" \
-+ ".section __smp_alternatives,\"a\"\n" \
-+ ".long 6667b\n" \
-+ ".long 6673f\n" \
-+ ".previous\n" \
-+ ".section __smp_replacements,\"a\"\n" \
-+ "6673:.byte 6668b-6667b\n" \
-+ ".byte 6670f-6669f\n" \
-+ ".byte 6671f-6670f\n" \
-+ ".byte 0\n" \
-+ ".byte %c0\n" \
-+ "6669:lock;addl $0,0(%%esp)\n" \
-+ "6670:" instr "\n" \
-+ "6671:\n" \
-+ ".previous\n" \
-+ : \
-+ : "i" (X86_FEATURE_XMM2) \
-+ : "memory")
-+#define smp_rmb() smp_alt_mb("lfence")
-+#define smp_mb() smp_alt_mb("mfence")
-+#define set_mb(var, value) do { \
-+unsigned long __set_mb_temp; \
-+__asm__ __volatile__("6667:movl %1, %0\n6668:\n" \
-+ ".section __smp_alternatives,\"a\"\n" \
-+ ".long 6667b\n" \
-+ ".long 6673f\n" \
-+ ".previous\n" \
-+ ".section __smp_replacements,\"a\"\n" \
-+ "6673: .byte 6668b-6667b\n" \
-+ ".byte 6670f-6669f\n" \
-+ ".byte 0\n" \
-+ ".byte 6671f-6670f\n" \
-+ ".byte -1\n" \
-+ "6669: xchg %1, %0\n" \
-+ "6670:movl %1, %0\n" \
-+ "6671:\n" \
-+ ".previous\n" \
-+ : "=m" (var), "=r" (__set_mb_temp) \
-+ : "1" (value) \
-+ : "memory"); } while (0)
-+#else
- #define smp_mb() mb()
- #define smp_rmb() rmb()
-+#define set_mb(var, value) do { (void) xchg(&var, value); } while (0)
-+#endif
- #define smp_wmb() wmb()
- #define smp_read_barrier_depends() read_barrier_depends()
--#define set_mb(var, value) do { (void) xchg(&var, value); } while (0)
- #else
- #define smp_mb() barrier()
- #define smp_rmb() barrier()
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|