# HG changeset patch
# User emellor@xxxxxxxxxxxxxxxxxxxxxx
# Node ID edefe24d78bd5e6e51bdd002f3ee7721d6dc2ce5
# Parent 7ad21a787d3f648e5bb434c9b613b949c6b7581e
# Parent 4d4b41264b849c1350e0755a58c32111bb828e49
Merged.
diff -r 7ad21a787d3f -r edefe24d78bd buildconfigs/linux-defconfig_xen0_ia64
--- a/buildconfigs/linux-defconfig_xen0_ia64 Tue Apr 11 11:46:39 2006
+++ b/buildconfigs/linux-defconfig_xen0_ia64 Tue Apr 11 11:51:48 2006
@@ -95,6 +95,7 @@
CONFIG_XEN_PRIVILEGED_GUEST=y
CONFIG_XEN_BLKDEV_GRANT=y
CONFIG_XEN_BLKDEV_FRONTEND=y
+CONFIG_XEN_BACKEND=y
CONFIG_XEN_BLKDEV_BACKEND=y
CONFIG_XEN_SYSFS=y
CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
diff -r 7ad21a787d3f -r edefe24d78bd buildconfigs/linux-defconfig_xen0_x86_32
--- a/buildconfigs/linux-defconfig_xen0_x86_32 Tue Apr 11 11:46:39 2006
+++ b/buildconfigs/linux-defconfig_xen0_x86_32 Tue Apr 11 11:51:48 2006
@@ -1316,6 +1316,7 @@
#
CONFIG_XEN_PRIVILEGED_GUEST=y
# CONFIG_XEN_UNPRIVILEGED_GUEST is not set
+CONFIG_XEN_BACKEND=y
CONFIG_XEN_PCIDEV_BACKEND=y
# CONFIG_XEN_PCIDEV_BACKEND_VPCI is not set
CONFIG_XEN_PCIDEV_BACKEND_PASS=y
diff -r 7ad21a787d3f -r edefe24d78bd buildconfigs/linux-defconfig_xen0_x86_64
--- a/buildconfigs/linux-defconfig_xen0_x86_64 Tue Apr 11 11:46:39 2006
+++ b/buildconfigs/linux-defconfig_xen0_x86_64 Tue Apr 11 11:51:48 2006
@@ -1246,6 +1246,7 @@
#
CONFIG_XEN_PRIVILEGED_GUEST=y
# CONFIG_XEN_UNPRIVILEGED_GUEST is not set
+CONFIG_XEN_BACKEND=y
CONFIG_XEN_PCIDEV_BACKEND=y
# CONFIG_XEN_PCIDEV_BACKEND_VPCI is not set
CONFIG_XEN_PCIDEV_BACKEND_PASS=y
diff -r 7ad21a787d3f -r edefe24d78bd buildconfigs/linux-defconfig_xenU_ia64
--- a/buildconfigs/linux-defconfig_xenU_ia64 Tue Apr 11 11:46:39 2006
+++ b/buildconfigs/linux-defconfig_xenU_ia64 Tue Apr 11 11:51:48 2006
@@ -92,6 +92,7 @@
CONFIG_XEN_PRIVILEGED_GUEST=y
CONFIG_XEN_BLKDEV_GRANT=y
CONFIG_XEN_BLKDEV_FRONTEND=y
+CONFIG_XEN_BACKEND=y
CONFIG_XEN_BLKDEV_BACKEND=y
CONFIG_XEN_SYSFS=y
CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
diff -r 7ad21a787d3f -r edefe24d78bd buildconfigs/linux-defconfig_xenU_x86_32
--- a/buildconfigs/linux-defconfig_xenU_x86_32 Tue Apr 11 11:46:39 2006
+++ b/buildconfigs/linux-defconfig_xenU_x86_32 Tue Apr 11 11:51:48 2006
@@ -859,13 +859,9 @@
#
# CONFIG_XEN_PRIVILEGED_GUEST is not set
CONFIG_XEN_UNPRIVILEGED_GUEST=y
-# CONFIG_XEN_PCIDEV_BACKEND is not set
-# CONFIG_XEN_BLKDEV_BACKEND is not set
-# CONFIG_XEN_NETDEV_BACKEND is not set
-# CONFIG_XEN_TPMDEV_BACKEND is not set
+# CONFIG_XEN_BACKEND is not set
CONFIG_XEN_BLKDEV_FRONTEND=y
CONFIG_XEN_NETDEV_FRONTEND=y
-# CONFIG_XEN_BLKDEV_TAP is not set
# CONFIG_XEN_TPMDEV_FRONTEND is not set
CONFIG_XEN_SCRUB_PAGES=y
CONFIG_XEN_DISABLE_SERIAL=y
diff -r 7ad21a787d3f -r edefe24d78bd buildconfigs/linux-defconfig_xenU_x86_64
--- a/buildconfigs/linux-defconfig_xenU_x86_64 Tue Apr 11 11:46:39 2006
+++ b/buildconfigs/linux-defconfig_xenU_x86_64 Tue Apr 11 11:51:48 2006
@@ -1135,13 +1135,9 @@
#
# CONFIG_XEN_PRIVILEGED_GUEST is not set
CONFIG_XEN_UNPRIVILEGED_GUEST=y
-# CONFIG_XEN_PCIDEV_BACKEND is not set
-# CONFIG_XEN_BLKDEV_BACKEND is not set
-# CONFIG_XEN_NETDEV_BACKEND is not set
-# CONFIG_XEN_TPMDEV_BACKEND is not set
+# CONFIG_XEN_BACKEND is not set
CONFIG_XEN_BLKDEV_FRONTEND=y
CONFIG_XEN_NETDEV_FRONTEND=y
-# CONFIG_XEN_BLKDEV_TAP is not set
# CONFIG_XEN_TPMDEV_FRONTEND is not set
CONFIG_XEN_SCRUB_PAGES=y
CONFIG_XEN_DISABLE_SERIAL=y
diff -r 7ad21a787d3f -r edefe24d78bd buildconfigs/linux-defconfig_xen_ia64
--- a/buildconfigs/linux-defconfig_xen_ia64 Tue Apr 11 11:46:39 2006
+++ b/buildconfigs/linux-defconfig_xen_ia64 Tue Apr 11 11:51:48 2006
@@ -95,6 +95,7 @@
CONFIG_XEN_PRIVILEGED_GUEST=y
CONFIG_XEN_BLKDEV_GRANT=y
CONFIG_XEN_BLKDEV_FRONTEND=y
+CONFIG_XEN_BACKEND=y
CONFIG_XEN_BLKDEV_BACKEND=y
CONFIG_XEN_SYSFS=y
CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
diff -r 7ad21a787d3f -r edefe24d78bd buildconfigs/linux-defconfig_xen_x86_32
--- a/buildconfigs/linux-defconfig_xen_x86_32 Tue Apr 11 11:46:39 2006
+++ b/buildconfigs/linux-defconfig_xen_x86_32 Tue Apr 11 11:51:48 2006
@@ -2979,6 +2979,7 @@
#
CONFIG_XEN_PRIVILEGED_GUEST=y
# CONFIG_XEN_UNPRIVILEGED_GUEST is not set
+CONFIG_XEN_BACKEND=y
CONFIG_XEN_PCIDEV_BACKEND=y
# CONFIG_XEN_PCIDEV_BACKEND_VPCI is not set
CONFIG_XEN_PCIDEV_BACKEND_PASS=y
diff -r 7ad21a787d3f -r edefe24d78bd buildconfigs/linux-defconfig_xen_x86_64
--- a/buildconfigs/linux-defconfig_xen_x86_64 Tue Apr 11 11:46:39 2006
+++ b/buildconfigs/linux-defconfig_xen_x86_64 Tue Apr 11 11:51:48 2006
@@ -2656,6 +2656,7 @@
#
CONFIG_XEN_PRIVILEGED_GUEST=y
# CONFIG_XEN_UNPRIVILEGED_GUEST is not set
+CONFIG_XEN_BACKEND=y
CONFIG_XEN_PCIDEV_BACKEND=y
# CONFIG_XEN_PCIDEV_BACKEND_VPCI is not set
CONFIG_XEN_PCIDEV_BACKEND_PASS=y
diff -r 7ad21a787d3f -r edefe24d78bd linux-2.6-xen-sparse/arch/ia64/Kconfig
--- a/linux-2.6-xen-sparse/arch/ia64/Kconfig Tue Apr 11 11:46:39 2006
+++ b/linux-2.6-xen-sparse/arch/ia64/Kconfig Tue Apr 11 11:51:48 2006
@@ -79,8 +79,13 @@
bool
default y
+config XEN_BACKEND
+ depends on XEN
+ bool
+ default y
+
config XEN_BLKDEV_BACKEND
- depends on XEN
+ depends on XEN && XEN_BACKEND
bool
default y
diff -r 7ad21a787d3f -r edefe24d78bd linux-2.6-xen-sparse/drivers/xen/Kconfig
--- a/linux-2.6-xen-sparse/drivers/xen/Kconfig Tue Apr 11 11:46:39 2006
+++ b/linux-2.6-xen-sparse/drivers/xen/Kconfig Tue Apr 11 11:51:48 2006
@@ -28,9 +28,16 @@
bool
default !XEN_PRIVILEGED_GUEST
+config XEN_BACKEND
+ tristate "Backend driver support"
+ default y
+ help
+ Support for backend device drivers that provide I/O services
+ to other virtual machines.
+
config XEN_PCIDEV_BACKEND
tristate "PCI device backend driver"
- depends PCI
+ depends on PCI && XEN_BACKEND
default XEN_PRIVILEGED_GUEST
help
The PCI device backend driver allows the kernel to export arbitrary
@@ -70,6 +77,7 @@
config XEN_BLKDEV_BACKEND
tristate "Block-device backend driver"
+ depends on XEN_BACKEND
default y
help
The block-device backend driver allows the kernel to export its
@@ -91,6 +99,7 @@
config XEN_NETDEV_BACKEND
tristate "Network-device backend driver"
+ depends on XEN_BACKEND
default y
help
The network-device backend driver allows the kernel to export its
@@ -120,6 +129,7 @@
config XEN_TPMDEV_BACKEND
tristate "TPM-device backend driver"
+ depends on XEN_BACKEND
default n
help
The TPM-device backend driver
@@ -155,6 +165,7 @@
config XEN_BLKDEV_TAP
tristate "Block device tap driver"
+ depends on XEN_BACKEND
default n
help
This driver allows a VM to interact on block device channels
diff -r 7ad21a787d3f -r edefe24d78bd
linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c
--- a/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c Tue Apr 11
11:46:39 2006
+++ b/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c Tue Apr 11
11:51:48 2006
@@ -300,13 +300,6 @@
goto abort_transaction;
}
- err = xenbus_printf(xbt, dev->nodename,
- "state", "%d", XenbusStateConnected);
- if (err) {
- message = "writing frontend XenbusStateConnected";
- goto abort_transaction;
- }
-
err = xenbus_transaction_end(xbt, 0);
if (err) {
if (err == -EAGAIN)
@@ -314,6 +307,8 @@
xenbus_dev_fatal(dev, err, "completing transaction");
goto destroy_ring;
}
+
+ xenbus_switch_state(dev, XenbusStateConnected);
return 0;
diff -r 7ad21a787d3f -r edefe24d78bd
linux-2.6-xen-sparse/drivers/xen/xenbus/Makefile
--- a/linux-2.6-xen-sparse/drivers/xen/xenbus/Makefile Tue Apr 11 11:46:39 2006
+++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/Makefile Tue Apr 11 11:51:48 2006
@@ -1,4 +1,8 @@
obj-y += xenbus.o
+obj-$(CONFIG_XEN_BACKEND) += xenbus_be.o
+
+xenbus_be-objs =
+xenbus_be-objs += xenbus_backend_client.o
xenbus-objs =
xenbus-objs += xenbus_client.o
diff -r 7ad21a787d3f -r edefe24d78bd
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_client.c
--- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_client.c Tue Apr 11
11:46:39 2006
+++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_client.c Tue Apr 11
11:51:48 2006
@@ -259,134 +259,6 @@
xenbus_dev_error(dev, err, "freeing event channel %d", port);
return err;
}
-
-
-/* Based on Rusty Russell's skeleton driver's map_page */
-int xenbus_map_ring_valloc(struct xenbus_device *dev, int gnt_ref, void
**vaddr)
-{
- struct gnttab_map_grant_ref op = {
- .flags = GNTMAP_host_map,
- .ref = gnt_ref,
- .dom = dev->otherend_id,
- };
- struct vm_struct *area;
-
- *vaddr = NULL;
-
- area = alloc_vm_area(PAGE_SIZE);
- if (!area)
- return -ENOMEM;
-
- op.host_addr = (unsigned long)area->addr;
-
- lock_vm_area(area);
- BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1));
- unlock_vm_area(area);
-
- if (op.status != GNTST_okay) {
- free_vm_area(area);
- xenbus_dev_fatal(dev, op.status,
- "mapping in shared page %d from domain %d",
- gnt_ref, dev->otherend_id);
- return op.status;
- }
-
- /* Stuff the handle in an unused field */
- area->phys_addr = (unsigned long)op.handle;
-
- *vaddr = area->addr;
- return 0;
-}
-EXPORT_SYMBOL_GPL(xenbus_map_ring_valloc);
-
-
-int xenbus_map_ring(struct xenbus_device *dev, int gnt_ref,
- grant_handle_t *handle, void *vaddr)
-{
- struct gnttab_map_grant_ref op = {
- .host_addr = (unsigned long)vaddr,
- .flags = GNTMAP_host_map,
- .ref = gnt_ref,
- .dom = dev->otherend_id,
- };
-
- BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1));
-
- if (op.status != GNTST_okay) {
- xenbus_dev_fatal(dev, op.status,
- "mapping in shared page %d from domain %d",
- gnt_ref, dev->otherend_id);
- } else
- *handle = op.handle;
-
- return op.status;
-}
-EXPORT_SYMBOL_GPL(xenbus_map_ring);
-
-
-/* Based on Rusty Russell's skeleton driver's unmap_page */
-int xenbus_unmap_ring_vfree(struct xenbus_device *dev, void *vaddr)
-{
- struct vm_struct *area;
- struct gnttab_unmap_grant_ref op = {
- .host_addr = (unsigned long)vaddr,
- };
-
- /* It'd be nice if linux/vmalloc.h provided a find_vm_area(void *addr)
- * method so that we don't have to muck with vmalloc internals here.
- * We could force the user to hang on to their struct vm_struct from
- * xenbus_map_ring_valloc, but these 6 lines considerably simplify
- * this API.
- */
- read_lock(&vmlist_lock);
- for (area = vmlist; area != NULL; area = area->next) {
- if (area->addr == vaddr)
- break;
- }
- read_unlock(&vmlist_lock);
-
- if (!area) {
- xenbus_dev_error(dev, -ENOENT,
- "can't find mapped virtual address %p", vaddr);
- return GNTST_bad_virt_addr;
- }
-
- op.handle = (grant_handle_t)area->phys_addr;
-
- lock_vm_area(area);
- BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1));
- unlock_vm_area(area);
-
- if (op.status == GNTST_okay)
- free_vm_area(area);
- else
- xenbus_dev_error(dev, op.status,
- "unmapping page at handle %d error %d",
- (int16_t)area->phys_addr, op.status);
-
- return op.status;
-}
-EXPORT_SYMBOL_GPL(xenbus_unmap_ring_vfree);
-
-
-int xenbus_unmap_ring(struct xenbus_device *dev,
- grant_handle_t handle, void *vaddr)
-{
- struct gnttab_unmap_grant_ref op = {
- .host_addr = (unsigned long)vaddr,
- .handle = handle,
- };
-
- BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1));
-
- if (op.status != GNTST_okay)
- xenbus_dev_error(dev, op.status,
- "unmapping page at handle %d error %d",
- handle, op.status);
-
- return op.status;
-}
-EXPORT_SYMBOL_GPL(xenbus_unmap_ring);
XenbusState xenbus_read_driver_state(const char *path)
diff -r 7ad21a787d3f -r edefe24d78bd
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c
--- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c Tue Apr 11
11:46:39 2006
+++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c Tue Apr 11
11:51:48 2006
@@ -1065,19 +1065,16 @@
*/
static int __init wait_for_devices(void)
{
- int i;
-
- for (i = 0; i < 10 * HZ; i++) {
- if (all_devices_ready()) {
- return;
- }
-
- set_current_state(TASK_INTERRUPTIBLE);
- schedule_timeout(1);
- }
-
- printk(KERN_WARNING
- "XENBUS: Timeout connecting to devices!\n");
+ unsigned long timeout = jiffies + 10*HZ;
+
+ while (time_before(jiffies, timeout)) {
+ if (all_devices_ready())
+ return 0;
+ schedule_timeout_interruptible(HZ/10);
+ }
+
+ printk(KERN_WARNING "XENBUS: Timeout connecting to devices!\n");
+ return 0;
}
late_initcall(wait_for_devices);
diff -r 7ad21a787d3f -r edefe24d78bd tools/xenstat/xentop/Makefile
--- a/tools/xenstat/xentop/Makefile Tue Apr 11 11:46:39 2006
+++ b/tools/xenstat/xentop/Makefile Tue Apr 11 11:51:48 2006
@@ -34,9 +34,6 @@
.PHONY: all
all: xentop
-.PHONY: xentop
-xentop: xentop.o
-
.PHONY: install
install: xentop xentop.1
$(INSTALL_PROG) xentop $(DESTDIR)$(sbindir)/xentop
diff -r 7ad21a787d3f -r edefe24d78bd tools/xenstore/Makefile
--- a/tools/xenstore/Makefile Tue Apr 11 11:46:39 2006
+++ b/tools/xenstore/Makefile Tue Apr 11 11:51:48 2006
@@ -57,14 +57,12 @@
xs_tdb_dump: xs_tdb_dump.o utils.o tdb.o talloc.o
$(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@
-.PHONY: xs_test xs_random xs_stress xs_crashme
xs_test xs_random xs_stress xs_crashme: LDFLAGS+=-lpthread
xs_test: xs_test.o xs_lib.o utils.o
xs_random: xs_random.o xs_test_lib.o xs_lib.o talloc.o utils.o
xs_stress: xs_stress.o xs_test_lib.o xs_lib.o talloc.o utils.o
xs_crashme: xs_crashme.o xs_lib.o talloc.o utils.o
-.PHONY: speedtest
speedtest: speedtest.o xs.o xs_lib.o utils.o talloc.o
.PHONY: check-speed
diff -r 7ad21a787d3f -r edefe24d78bd xen/arch/ia64/tools/privop/Makefile
--- a/xen/arch/ia64/tools/privop/Makefile Tue Apr 11 11:46:39 2006
+++ b/xen/arch/ia64/tools/privop/Makefile Tue Apr 11 11:51:48 2006
@@ -4,7 +4,6 @@
.PHONY: all
all: postat
-.PHONY: postat
postat: postat.c pohcalls.o
.PHONY: clean
diff -r 7ad21a787d3f -r edefe24d78bd xen/arch/x86/hvm/platform.c
--- a/xen/arch/x86/hvm/platform.c Tue Apr 11 11:46:39 2006
+++ b/xen/arch/x86/hvm/platform.c Tue Apr 11 11:51:48 2006
@@ -401,6 +401,11 @@
GET_OP_SIZE_FOR_NONEBYTE(instr->op_size);
return reg_mem(instr->op_size, opcode, instr, rex);
+ case 0x3B: /* cmp m32/16, r32/16 */
+ instr->instr = INSTR_CMP;
+ GET_OP_SIZE_FOR_NONEBYTE(instr->op_size);
+ return mem_reg(instr->op_size, opcode, instr, rex);
+
case 0x80:
case 0x81:
{
diff -r 7ad21a787d3f -r edefe24d78bd xen/arch/x86/hvm/vmx/vmx.c
--- a/xen/arch/x86/hvm/vmx/vmx.c Tue Apr 11 11:46:39 2006
+++ b/xen/arch/x86/hvm/vmx/vmx.c Tue Apr 11 11:51:48 2006
@@ -1947,7 +1947,7 @@
&& !(vector & INTR_INFO_VALID_MASK))
__hvm_bug(regs);
- vector &= 0xff;
+ vector &= INTR_INFO_VECTOR_MASK;
local_irq_disable();
TRACE_VMEXIT(1,vector);
@@ -2077,10 +2077,8 @@
return;
}
- {
- __vmread(GUEST_RIP, &eip);
- TRACE_VMEXIT(0,exit_reason);
- }
+ __vmread(GUEST_RIP, &eip);
+ TRACE_VMEXIT(0,exit_reason);
switch (exit_reason) {
case EXIT_REASON_EXCEPTION_NMI:
@@ -2097,7 +2095,7 @@
if ((error = __vmread(VM_EXIT_INTR_INFO, &vector))
|| !(vector & INTR_INFO_VALID_MASK))
__hvm_bug(®s);
- vector &= 0xff;
+ vector &= INTR_INFO_VECTOR_MASK;
TRACE_VMEXIT(1,vector);
perfc_incra(cause_vector, vector);
diff -r 7ad21a787d3f -r edefe24d78bd xen/include/asm-ia64/event.h
--- a/xen/include/asm-ia64/event.h Tue Apr 11 11:46:39 2006
+++ b/xen/include/asm-ia64/event.h Tue Apr 11 11:51:48 2006
@@ -32,4 +32,9 @@
vcpu_pend_interrupt(v, v->vcpu_info->arch.evtchn_vector);
}
+/* Note: Bitwise operations result in fast code with no branches. */
+#define event_pending(v) \
+ (!!(v)->vcpu_info->evtchn_upcall_pending & \
+ !(v)->vcpu_info->evtchn_upcall_mask)
+
#endif
diff -r 7ad21a787d3f -r edefe24d78bd xen/include/asm-x86/event.h
--- a/xen/include/asm-x86/event.h Tue Apr 11 11:46:39 2006
+++ b/xen/include/asm-x86/event.h Tue Apr 11 11:51:48 2006
@@ -26,4 +26,9 @@
smp_send_event_check_cpu(v->processor);
}
+/* Note: Bitwise operations result in fast code with no branches. */
+#define event_pending(v) \
+ (!!(v)->vcpu_info->evtchn_upcall_pending & \
+ !(v)->vcpu_info->evtchn_upcall_mask)
+
#endif
diff -r 7ad21a787d3f -r edefe24d78bd xen/include/asm-x86/hvm/io.h
--- a/xen/include/asm-x86/hvm/io.h Tue Apr 11 11:46:39 2006
+++ b/xen/include/asm-x86/hvm/io.h Tue Apr 11 11:51:48 2006
@@ -77,7 +77,7 @@
__u32 flags;
};
-#define MAX_INST_LEN 32
+#define MAX_INST_LEN 15 /* Maximum instruction length = 15 bytes */
struct mmio_op {
int flags;
diff -r 7ad21a787d3f -r edefe24d78bd xen/include/xen/event.h
--- a/xen/include/xen/event.h Tue Apr 11 11:46:39 2006
+++ b/xen/include/xen/event.h Tue Apr 11 11:51:48 2006
@@ -38,11 +38,6 @@
*/
extern void send_guest_pirq(struct domain *d, int pirq);
-/* Note: Bitwise operations result in fast code with no branches. */
-#define event_pending(v) \
- (!!(v)->vcpu_info->evtchn_upcall_pending & \
- !(v)->vcpu_info->evtchn_upcall_mask)
-
#define evtchn_pending(d, p) \
(test_bit((p), &(d)->shared_info->evtchn_pending[0]))
diff -r 7ad21a787d3f -r edefe24d78bd xen/tools/Makefile
--- a/xen/tools/Makefile Tue Apr 11 11:46:39 2006
+++ b/xen/tools/Makefile Tue Apr 11 11:51:48 2006
@@ -11,6 +11,5 @@
$(MAKE) -C figlet clean
rm -f *.o symbols
-.PHONY: symbols
symbols: symbols.c
$(HOSTCC) $(HOSTCFLAGS) -o $@ $<
diff -r 7ad21a787d3f -r edefe24d78bd
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_backend_client.c
--- /dev/null Tue Apr 11 11:46:39 2006
+++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_backend_client.c Tue Apr
11 11:51:48 2006
@@ -0,0 +1,173 @@
+/******************************************************************************
+ * Backend-client-facing interface for the Xenbus driver. In other words, the
+ * interface between the Xenbus and the device-specific code in the backend
+ * driver.
+ *
+ * Copyright (C) 2005-2006 XenSource Ltd
+ *
+ * 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; or, when distributed
+ * separately from the Linux kernel or incorporated into other
+ * software packages, subject to the following license:
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this source file (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy, modify,
+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
+ * and to permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+#include <xen/gnttab.h>
+#include <xen/xenbus.h>
+#include <xen/driver_util.h>
+
+/* Based on Rusty Russell's skeleton driver's map_page */
+int xenbus_map_ring_valloc(struct xenbus_device *dev, int gnt_ref, void
**vaddr)
+{
+ struct gnttab_map_grant_ref op = {
+ .flags = GNTMAP_host_map,
+ .ref = gnt_ref,
+ .dom = dev->otherend_id,
+ };
+ struct vm_struct *area;
+
+ *vaddr = NULL;
+
+ area = alloc_vm_area(PAGE_SIZE);
+ if (!area)
+ return -ENOMEM;
+
+ op.host_addr = (unsigned long)area->addr;
+
+ lock_vm_area(area);
+ BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1));
+ unlock_vm_area(area);
+
+ if (op.status != GNTST_okay) {
+ free_vm_area(area);
+ xenbus_dev_fatal(dev, op.status,
+ "mapping in shared page %d from domain %d",
+ gnt_ref, dev->otherend_id);
+ return op.status;
+ }
+
+ /* Stuff the handle in an unused field */
+ area->phys_addr = (unsigned long)op.handle;
+
+ *vaddr = area->addr;
+ return 0;
+}
+EXPORT_SYMBOL_GPL(xenbus_map_ring_valloc);
+
+
+int xenbus_map_ring(struct xenbus_device *dev, int gnt_ref,
+ grant_handle_t *handle, void *vaddr)
+{
+ struct gnttab_map_grant_ref op = {
+ .host_addr = (unsigned long)vaddr,
+ .flags = GNTMAP_host_map,
+ .ref = gnt_ref,
+ .dom = dev->otherend_id,
+ };
+
+ BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1));
+
+ if (op.status != GNTST_okay) {
+ xenbus_dev_fatal(dev, op.status,
+ "mapping in shared page %d from domain %d",
+ gnt_ref, dev->otherend_id);
+ } else
+ *handle = op.handle;
+
+ return op.status;
+}
+EXPORT_SYMBOL_GPL(xenbus_map_ring);
+
+
+/* Based on Rusty Russell's skeleton driver's unmap_page */
+int xenbus_unmap_ring_vfree(struct xenbus_device *dev, void *vaddr)
+{
+ struct vm_struct *area;
+ struct gnttab_unmap_grant_ref op = {
+ .host_addr = (unsigned long)vaddr,
+ };
+
+ /* It'd be nice if linux/vmalloc.h provided a find_vm_area(void *addr)
+ * method so that we don't have to muck with vmalloc internals here.
+ * We could force the user to hang on to their struct vm_struct from
+ * xenbus_map_ring_valloc, but these 6 lines considerably simplify
+ * this API.
+ */
+ read_lock(&vmlist_lock);
+ for (area = vmlist; area != NULL; area = area->next) {
+ if (area->addr == vaddr)
+ break;
+ }
+ read_unlock(&vmlist_lock);
+
+ if (!area) {
+ xenbus_dev_error(dev, -ENOENT,
+ "can't find mapped virtual address %p", vaddr);
+ return GNTST_bad_virt_addr;
+ }
+
+ op.handle = (grant_handle_t)area->phys_addr;
+
+ lock_vm_area(area);
+ BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1));
+ unlock_vm_area(area);
+
+ if (op.status == GNTST_okay)
+ free_vm_area(area);
+ else
+ xenbus_dev_error(dev, op.status,
+ "unmapping page at handle %d error %d",
+ (int16_t)area->phys_addr, op.status);
+
+ return op.status;
+}
+EXPORT_SYMBOL_GPL(xenbus_unmap_ring_vfree);
+
+
+int xenbus_unmap_ring(struct xenbus_device *dev,
+ grant_handle_t handle, void *vaddr)
+{
+ struct gnttab_unmap_grant_ref op = {
+ .host_addr = (unsigned long)vaddr,
+ .handle = handle,
+ };
+
+ BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1));
+
+ if (op.status != GNTST_okay)
+ xenbus_dev_error(dev, op.status,
+ "unmapping page at handle %d error %d",
+ handle, op.status);
+
+ return op.status;
+}
+EXPORT_SYMBOL_GPL(xenbus_unmap_ring);
+
+
+/*
+ * Local variables:
+ * c-file-style: "linux"
+ * indent-tabs-mode: t
+ * c-indent-level: 8
+ * c-basic-offset: 8
+ * tab-width: 8
+ * End:
+ */
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|