rpms/kernel-xen-2.6/devel linux-2.6-xen-0009-xen-Add-a-vmlinuz-target.patch, NONE, 1.1.2.1 linux-2.6-xen-0010-xen-Add-empty-xenctrl-module.patch, NONE, 1.1.2.1 linux-2.6-xen-0011-xen-Add-proc-xen-capabilities.patch, NONE, 1.1.2.1 linux-2.6-xen-0012-xen-Add-proc-xen-privcmd.patch, NONE, 1.1.2.1 linux-2.6-xen-0013-xen-Add-proc-xen-xenbus.patch, NONE, 1.1.2.1 linux-2.6-xen-0014-xen-Add-Xen-s-sys-hypervisor-interface.patch, NONE, 1.1.2.1 linux-2.6-xen-0015-xen-debug-Add-xprintk-to-log-directly-via-hypercall.patch, NONE, 1.1.2.1 linux-2.6-xen-0016-xen-x86_64-Initial-x86_64-support-for-Xen-paravirt_.patch, NONE, 1.1.2.1 Makefile, 1.2.6.5, 1.2.6.6 Makefile.config, 1.2.4.5, 1.2.4.6 config-xen-generic, 1.2.4.3, 1.2.4.4 kernel.spec, 1.11.2.14, 1.11.2.15 linux-2.6-xen-0009-xen-dom0-Add-a-vmlinuz-target.patch, 1.1.2.1, NONE linux-2.6-xen-0010-xen-debug-Add-xprintk-to-log-directly-via-hypercall.patch, 1.1.2.1, NONE linux-2.6-xen-0011-xen-x86_64-Initial-x86_64-support-for-Xen-paravirt_.patch, 1.1.2.1, NONE
Mark McLoughlin (markmc)
fedora-extras-commits at redhat.com
Thu Mar 6 10:41:11 UTC 2008
Author: markmc
Update of /cvs/pkgs/rpms/kernel-xen-2.6/devel
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv29481
Modified Files:
Tag: private-markmc-pv-ops-branch
Makefile Makefile.config config-xen-generic kernel.spec
Added Files:
Tag: private-markmc-pv-ops-branch
linux-2.6-xen-0009-xen-Add-a-vmlinuz-target.patch
linux-2.6-xen-0010-xen-Add-empty-xenctrl-module.patch
linux-2.6-xen-0011-xen-Add-proc-xen-capabilities.patch
linux-2.6-xen-0012-xen-Add-proc-xen-privcmd.patch
linux-2.6-xen-0013-xen-Add-proc-xen-xenbus.patch
linux-2.6-xen-0014-xen-Add-Xen-s-sys-hypervisor-interface.patch
linux-2.6-xen-0015-xen-debug-Add-xprintk-to-log-directly-via-hypercall.patch
linux-2.6-xen-0016-xen-x86_64-Initial-x86_64-support-for-Xen-paravirt_.patch
Removed Files:
Tag: private-markmc-pv-ops-branch
linux-2.6-xen-0009-xen-dom0-Add-a-vmlinuz-target.patch
linux-2.6-xen-0010-xen-debug-Add-xprintk-to-log-directly-via-hypercall.patch
linux-2.6-xen-0011-xen-x86_64-Initial-x86_64-support-for-Xen-paravirt_.patch
Log Message:
* Thu Mar 05 2008 Mark McLoughlin <markmc at redhat.com>
- Add /proc/xen and /sys/hypervisor
linux-2.6-xen-0009-xen-Add-a-vmlinuz-target.patch:
--- NEW FILE linux-2.6-xen-0009-xen-Add-a-vmlinuz-target.patch ---
>From cf0f35fc0d69ca088953e0cba566bfa503488b6b Mon Sep 17 00:00:00 2001
From: Mark McLoughlin <markmc at redhat.com>
Date: Tue, 19 Feb 2008 15:34:32 +0000
Subject: [PATCH] xen: Add a vmlinuz target
Although patches are in progress to allow Xen boot
a DomU using a bzImage, support for booting a Dom0
using a bzImage is still a ways off.
For now, just add a target to build a gzip-ed ELF
file which Xen can use to boot both Dom0 and DomU.
Signed-off-by: Mark McLoughlin <markmc at redhat.com>
---
arch/x86/Makefile | 9 +++++++++
arch/x86/boot/.gitignore | 1 +
arch/x86/boot/Makefile | 9 +++++++++
3 files changed, 19 insertions(+), 0 deletions(-)
diff --git a/arch/x86/Makefile b/arch/x86/Makefile
index f1e739a..14a752e 100644
--- a/arch/x86/Makefile
+++ b/arch/x86/Makefile
@@ -206,6 +206,15 @@ boot := arch/x86/boot
PHONY += zImage bzImage compressed zlilo bzlilo \
zdisk bzdisk fdimage fdimage144 fdimage288 isoimage install
+ifdef CONFIG_XEN
+PHONY += vmlinuz
+all: vmlinuz
+
+vmlinuz: KBUILD_IMAGE := $(boot)/vmlinuz
+vmlinuz: vmlinux
+ $(Q)$(MAKE) $(build)=$(boot) $(KBUILD_IMAGE)
+endif
+
# Default kernel to build
all: bzImage
diff --git a/arch/x86/boot/.gitignore b/arch/x86/boot/.gitignore
index b1bdc4c..35e7956 100644
--- a/arch/x86/boot/.gitignore
+++ b/arch/x86/boot/.gitignore
@@ -5,3 +5,4 @@ setup.bin
setup.elf
cpustr.h
mkcpustr
+vmlinuz
diff --git a/arch/x86/boot/Makefile b/arch/x86/boot/Makefile
index f88458e..61bba92 100644
--- a/arch/x86/boot/Makefile
+++ b/arch/x86/boot/Makefile
@@ -26,6 +26,7 @@ SVGA_MODE := -DSVGA_MODE=NORMAL_VGA
#RAMDISK := -DRAMDISK=512
targets := vmlinux.bin setup.bin setup.elf zImage bzImage
+targets += vmlinuz vmlinux-stripped
subdir- := compressed
setup-y += a20.o cmdline.o copy.o cpu.o cpucheck.o edd.o
@@ -105,6 +106,14 @@ $(obj)/setup.bin: $(obj)/setup.elf FORCE
$(obj)/compressed/vmlinux: FORCE
$(Q)$(MAKE) $(build)=$(obj)/compressed IMAGE_OFFSET=$(IMAGE_OFFSET) $@
+$(obj)/vmlinuz: $(obj)/vmlinux-stripped FORCE
+ $(call if_changed,gzip)
+ @echo 'Kernel: $@ is ready' ' (#'`cat .version`')'
+
+$(obj)/vmlinux-stripped: OBJCOPYFLAGS := -g --strip-unneeded
+$(obj)/vmlinux-stripped: vmlinux FORCE
+ $(call if_changed,objcopy)
+
# Set this if you want to pass append arguments to the zdisk/fdimage/isoimage kernel
FDARGS =
# Set this if you want an initrd included with the zdisk/fdimage/isoimage kernel
--
1.5.4.1
linux-2.6-xen-0010-xen-Add-empty-xenctrl-module.patch:
--- NEW FILE linux-2.6-xen-0010-xen-Add-empty-xenctrl-module.patch ---
>From 1f09b9348726be2b7a25427c21a08f8c16e7a5a2 Mon Sep 17 00:00:00 2001
From: Mark McLoughlin <markmc at redhat.com>
Date: Mon, 4 Feb 2008 08:30:37 +0000
Subject: [PATCH] xen: Add empty xenctrl module
Add the basic infrastructure for a xenctrl module
which will contain the various kernel interfaces
used by (mainly Dom0) Xen userspace.
Signed-off-by: Mark McLoughlin <markmc at redhat.com>
---
arch/x86/xen/Kconfig | 7 +++++
drivers/xen/Makefile | 2 +
drivers/xen/xenctrl/Makefile | 4 +++
drivers/xen/xenctrl/main.c | 62 ++++++++++++++++++++++++++++++++++++++++++
4 files changed, 75 insertions(+), 0 deletions(-)
create mode 100644 drivers/xen/xenctrl/Makefile
create mode 100644 drivers/xen/xenctrl/main.c
diff --git a/arch/x86/xen/Kconfig b/arch/x86/xen/Kconfig
index 4d5f264..4723bc1 100644
--- a/arch/x86/xen/Kconfig
+++ b/arch/x86/xen/Kconfig
@@ -11,3 +11,10 @@ config XEN
This is the Linux Xen port. Enabling this will allow the
kernel to boot in a paravirtualized environment under the
Xen hypervisor.
+
+config XENCTRL
+ tristate "Xen's user space control interfaces"
+ depends on XEN && PROC_FS
+ default y if XEN
+ help
+ This is the /proc/xen interface used by Xen's libxc.
diff --git a/drivers/xen/Makefile b/drivers/xen/Makefile
index 56592f0..6737463 100644
--- a/drivers/xen/Makefile
+++ b/drivers/xen/Makefile
@@ -1,2 +1,4 @@
obj-y += grant-table.o
obj-y += xenbus/
+
+obj-$(CONFIG_XENCTRL) += xenctrl/
diff --git a/drivers/xen/xenctrl/Makefile b/drivers/xen/xenctrl/Makefile
new file mode 100644
index 0000000..1f43a43
--- /dev/null
+++ b/drivers/xen/xenctrl/Makefile
@@ -0,0 +1,4 @@
+obj-$(CONFIG_XENCTRL) += xenctrl.o
+
+xenctrl-objs =
+xenctrl-objs += main.o
diff --git a/drivers/xen/xenctrl/main.c b/drivers/xen/xenctrl/main.c
new file mode 100644
index 0000000..2965ceb
--- /dev/null
+++ b/drivers/xen/xenctrl/main.c
@@ -0,0 +1,62 @@
+/******************************************************************************
+ *
+ * main.c
+ *
+ * Xen userspace control interfaces
+ *
+ * Copyright (c) 2002-2004, K A Fraser, B Dragovic
+ *
+ * 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 <linux/proc_fs.h>
+#include <linux/module.h>
+#include <asm/xen/hypervisor.h>
+
+static int __init xenctrl_init(void)
+{
+ struct proc_dir_entry *dir;
+
+ if (!is_running_on_xen())
+ return -ENODEV;
+
+ dir = proc_mkdir("xen", NULL);
+ if (!dir)
+ return -ENOMEM;
+
+ dir->owner = THIS_MODULE;
+
+ return 0;
+}
+
+static void __exit xenctrl_exit(void)
+{
+ remove_proc_entry("xen", NULL);
+}
+
+module_init(xenctrl_init);
+module_exit(xenctrl_exit);
+
+MODULE_LICENSE("Dual BSD/GPL");
--
1.5.4.1
linux-2.6-xen-0011-xen-Add-proc-xen-capabilities.patch:
--- NEW FILE linux-2.6-xen-0011-xen-Add-proc-xen-capabilities.patch ---
>From 1d322cb04345404de611fc9b7e10c78bf957eb49 Mon Sep 17 00:00:00 2001
From: Mark McLoughlin <markmc at redhat.com>
Date: Mon, 4 Feb 2008 09:16:51 +0000
Subject: [PATCH] xen: Add /proc/xen/capabilities
/proc/xen/capabilities is used by the xend init script
to check whether it is running on Dom0.
Signed-off-by: Mark McLoughlin <markmc at redhat.com>
---
drivers/xen/xenctrl/Makefile | 1 +
drivers/xen/xenctrl/capabilities.c | 68 ++++++++++++++++++++++++++++++++++++
drivers/xen/xenctrl/main.c | 11 ++++++
drivers/xen/xenctrl/xenctrl.h | 39 ++++++++++++++++++++
4 files changed, 119 insertions(+), 0 deletions(-)
create mode 100644 drivers/xen/xenctrl/capabilities.c
create mode 100644 drivers/xen/xenctrl/xenctrl.h
diff --git a/drivers/xen/xenctrl/Makefile b/drivers/xen/xenctrl/Makefile
index 1f43a43..631f535 100644
--- a/drivers/xen/xenctrl/Makefile
+++ b/drivers/xen/xenctrl/Makefile
@@ -2,3 +2,4 @@ obj-$(CONFIG_XENCTRL) += xenctrl.o
xenctrl-objs =
xenctrl-objs += main.o
+xenctrl-objs += capabilities.o
diff --git a/drivers/xen/xenctrl/capabilities.c b/drivers/xen/xenctrl/capabilities.c
new file mode 100644
index 0000000..1ff078a
--- /dev/null
+++ b/drivers/xen/xenctrl/capabilities.c
@@ -0,0 +1,68 @@
+/******************************************************************************
+ *
+ * capabilities.c
+ *
+ * /proc/xen/capabilities
+ *
+ * Copyright (c) 2002-2004, K A Fraser, B Dragovic
+ *
+ * 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 <linux/proc_fs.h>
+#include <linux/module.h>
+#include <asm/xen/hypervisor.h>
+
+static int capabilities_read(char *page, char **start, off_t off,
+ int count, int *eof, void *data)
+{
+ int len = 0;
+ *page = 0;
+
+ if (is_initial_xendomain())
+ len = sprintf(page, "control_d\n");
+
+ *eof = 1;
+ return len;
+}
+
+int __init capabilities_create_proc_entry(void)
+{
+ struct proc_dir_entry *entry;
+
+ entry = create_proc_entry("xen/capabilities", 0400, NULL);
+ if (!entry)
+ return -ENOMEM;
+
+ entry->owner = THIS_MODULE;
+ entry->read_proc = capabilities_read;
+
+ return 0;
+}
+
+void __exit capabilities_remove_proc_entry(void)
+{
+ remove_proc_entry("xen/capabilities", NULL);
+}
diff --git a/drivers/xen/xenctrl/main.c b/drivers/xen/xenctrl/main.c
index 2965ceb..0e42f7e 100644
--- a/drivers/xen/xenctrl/main.c
+++ b/drivers/xen/xenctrl/main.c
@@ -31,6 +31,8 @@
* IN THE SOFTWARE.
*/
+#include "xenctrl.h"
+
#include <linux/proc_fs.h>
#include <linux/module.h>
#include <asm/xen/hypervisor.h>
@@ -38,6 +40,7 @@
static int __init xenctrl_init(void)
{
struct proc_dir_entry *dir;
+ int ret;
if (!is_running_on_xen())
return -ENODEV;
@@ -48,11 +51,19 @@ static int __init xenctrl_init(void)
dir->owner = THIS_MODULE;
+ ret = capabilities_create_proc_entry();
+ if (ret)
+ goto fail1;
+
return 0;
+
+ fail1: remove_proc_entry("xen", NULL);
+ return ret;
}
static void __exit xenctrl_exit(void)
{
+ capabilities_remove_proc_entry();
remove_proc_entry("xen", NULL);
}
diff --git a/drivers/xen/xenctrl/xenctrl.h b/drivers/xen/xenctrl/xenctrl.h
new file mode 100644
index 0000000..7378dde
--- /dev/null
+++ b/drivers/xen/xenctrl/xenctrl.h
@@ -0,0 +1,39 @@
+/******************************************************************************
+ * xenctl.h
+ *
+ * Xen userspace control interfaces
+ *
+ * Copyright (c) 2002-2004, K A Fraser, B Dragovic
+ *
+ * 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 <linux/init.h>
+
+/*
+ * capabilities.c
+ */
+int capabilities_create_proc_entry(void) __init;
+void capabilities_remove_proc_entry(void) __exit;
--
1.5.4.1
linux-2.6-xen-0012-xen-Add-proc-xen-privcmd.patch:
--- NEW FILE linux-2.6-xen-0012-xen-Add-proc-xen-privcmd.patch ---
>From b897a4dad96c4695994783da288a44818579f868 Mon Sep 17 00:00:00 2001
From: Mark McLoughlin <markmc at redhat.com>
Date: Mon, 4 Feb 2008 08:24:57 +0000
Subject: [PATCH] xen: Add /proc/xen/privcmd
/proc/xen/privcmd is an ioctl() interface which allows
userspace apps to invoke hypercalls.
There should also be an ioctl (IOCTL_PRIVCMD_MMAP)
which is used to map foreign pages into a processes
address space, but we leave this unimplemented for
now pending further work on foreign page support.
Signed-off-by: Mark McLoughlin <markmc at redhat.com>
---
drivers/xen/xenctrl/Makefile | 1 +
drivers/xen/xenctrl/main.c | 6 +++
drivers/xen/xenctrl/privcmd.c | 81 +++++++++++++++++++++++++++++++++++++++
drivers/xen/xenctrl/xenctrl.h | 6 +++
include/asm-x86/xen/hypercall.h | 28 +++++++++++++
include/xen/sys/privcmd.h | 79 ++++++++++++++++++++++++++++++++++++++
6 files changed, 201 insertions(+), 0 deletions(-)
create mode 100644 drivers/xen/xenctrl/privcmd.c
create mode 100644 include/xen/sys/privcmd.h
diff --git a/drivers/xen/xenctrl/Makefile b/drivers/xen/xenctrl/Makefile
index 631f535..8a706cb 100644
--- a/drivers/xen/xenctrl/Makefile
+++ b/drivers/xen/xenctrl/Makefile
@@ -3,3 +3,4 @@ obj-$(CONFIG_XENCTRL) += xenctrl.o
xenctrl-objs =
xenctrl-objs += main.o
xenctrl-objs += capabilities.o
+xenctrl-objs += privcmd.o
diff --git a/drivers/xen/xenctrl/main.c b/drivers/xen/xenctrl/main.c
index 0e42f7e..d1fe6ef 100644
--- a/drivers/xen/xenctrl/main.c
+++ b/drivers/xen/xenctrl/main.c
@@ -55,14 +55,20 @@ static int __init xenctrl_init(void)
if (ret)
goto fail1;
+ ret = privcmd_create_proc_entry();
+ if (ret)
+ goto fail2;
+
return 0;
+ fail2: capabilities_remove_proc_entry();
fail1: remove_proc_entry("xen", NULL);
return ret;
}
static void __exit xenctrl_exit(void)
{
+ privcmd_remove_proc_entry();
capabilities_remove_proc_entry();
remove_proc_entry("xen", NULL);
}
diff --git a/drivers/xen/xenctrl/privcmd.c b/drivers/xen/xenctrl/privcmd.c
new file mode 100644
index 0000000..58c4b83
--- /dev/null
+++ b/drivers/xen/xenctrl/privcmd.c
@@ -0,0 +1,81 @@
+/******************************************************************************
+ * privcmd.c
+ *
+ * Interface to privileged domain-0 commands.
+ *
+ * Copyright (c) 2002-2004, K A Fraser, B Dragovic
+ *
+ * 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 <linux/proc_fs.h>
+#include <linux/module.h>
+#include <linux/uaccess.h>
+#include <asm/xen/hypervisor.h>
+#include <xen/sys/privcmd.h>
+
+static long privcmd_ioctl(struct file *file, unsigned int cmd,
+ unsigned long arg)
+{
+ switch (cmd) {
+ case IOCTL_PRIVCMD_HYPERCALL: {
+ privcmd_hypercall_t cmd;
+
+ if (copy_from_user(&cmd, (void __user *)arg, sizeof(cmd)))
+ return -EFAULT;
+
+ return privcmd_hypercall(&cmd);
+ }
+
+ case IOCTL_PRIVCMD_MMAP:
+ case IOCTL_PRIVCMD_MMAPBATCH:
+ printk(KERN_WARNING "IOCTL_PRIVCMD_MMAP ioctl not yet implemented\n");
+ default:
+ return -EINVAL;
+ }
+}
+
+static const struct file_operations privcmd_file_ops = {
+ .unlocked_ioctl = privcmd_ioctl,
+};
+
+int __init privcmd_create_proc_entry(void)
+{
+ static struct proc_dir_entry *entry;
+
+ entry = create_proc_entry("xen/privcmd", 0400, NULL);
+ if (!entry)
+ return -ENOMEM;
+
+ entry->owner = THIS_MODULE;
+ entry->proc_fops = &privcmd_file_ops;
+
+ return 0;
+}
+
+void __exit privcmd_remove_proc_entry(void)
+{
+ remove_proc_entry("xen/privcmd", NULL);
+}
diff --git a/drivers/xen/xenctrl/xenctrl.h b/drivers/xen/xenctrl/xenctrl.h
index 7378dde..a35209a 100644
--- a/drivers/xen/xenctrl/xenctrl.h
+++ b/drivers/xen/xenctrl/xenctrl.h
@@ -37,3 +37,9 @@
*/
int capabilities_create_proc_entry(void) __init;
void capabilities_remove_proc_entry(void) __exit;
+
+/*
+ * privcmd.c
+ */
+int privcmd_create_proc_entry(void) __init;
+void privcmd_remove_proc_entry(void) __exit;
diff --git a/include/asm-x86/xen/hypercall.h b/include/asm-x86/xen/hypercall.h
index bc0ee7d..cd554ca 100644
--- a/include/asm-x86/xen/hypercall.h
+++ b/include/asm-x86/xen/hypercall.h
@@ -410,4 +410,32 @@ MULTI_stack_switch(struct multicall_entry *mcl,
mcl->args[1] = esp;
}
+#include <xen/sys/privcmd.h>
+
+static inline int privcmd_hypercall(privcmd_hypercall_t *hypercall)
+{
+ int ret;
+
+ if (hypercall->op >= (PAGE_SIZE >> 5))
+ return -EINVAL;
+
+ __asm__ __volatile__ (
+ "pushl %%ebx; pushl %%ecx; pushl %%edx; "
+ "pushl %%esi; pushl %%edi; "
+ "movl 8(%%eax),%%ebx ;"
+ "movl 16(%%eax),%%ecx ;"
+ "movl 24(%%eax),%%edx ;"
+ "movl 32(%%eax),%%esi ;"
+ "movl 40(%%eax),%%edi ;"
+ "movl (%%eax),%%eax ;"
+ "shll $5,%%eax ;"
+ "addl $hypercall_page,%%eax ;"
+ "call *%%eax ;"
+ "popl %%edi; popl %%esi; popl %%edx; "
+ "popl %%ecx; popl %%ebx"
+ : "=a" (ret) : "0" (hypercall) : "memory" );
+
+ return ret;
+}
+
#endif /* __HYPERCALL_H__ */
diff --git a/include/xen/sys/privcmd.h b/include/xen/sys/privcmd.h
new file mode 100644
index 0000000..9cfa9d7
--- /dev/null
+++ b/include/xen/sys/privcmd.h
@@ -0,0 +1,79 @@
+/******************************************************************************
+ * privcmd.h
+ *
+ * Interface to /proc/xen/privcmd.
+ *
+ * Copyright (c) 2003-2005, K A Fraser
+ *
+ * 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.
+ */
+
+#ifndef __LINUX_PUBLIC_PRIVCMD_H__
+#define __LINUX_PUBLIC_PRIVCMD_H__
+
+#include <linux/types.h>
+
+#ifndef __user
+#define __user
+#endif
+
+typedef struct privcmd_hypercall
+{
+ __u64 op;
+ __u64 arg[5];
+} privcmd_hypercall_t;
+
+typedef struct privcmd_mmap_entry {
+ __u64 va;
+ __u64 mfn;
+ __u64 npages;
+} privcmd_mmap_entry_t;
+
+typedef struct privcmd_mmap {
+ int num;
+ domid_t dom; /* target domain */
+ privcmd_mmap_entry_t __user *entry;
+} privcmd_mmap_t;
+
+typedef struct privcmd_mmapbatch {
+ int num; /* number of pages to populate */
+ domid_t dom; /* target domain */
+ __u64 addr; /* virtual address */
+ ulong __user *arr; /* array of mfns - top nibble set on err */
+} privcmd_mmapbatch_t;
+
+/*
+ * @cmd: IOCTL_PRIVCMD_HYPERCALL
+ * @arg: &privcmd_hypercall_t
+ * Return: Value returned from execution of the specified hypercall.
+ */
+#define IOCTL_PRIVCMD_HYPERCALL \
+ _IOC(_IOC_NONE, 'P', 0, sizeof(privcmd_hypercall_t))
+#define IOCTL_PRIVCMD_MMAP \
+ _IOC(_IOC_NONE, 'P', 2, sizeof(privcmd_mmap_t))
+#define IOCTL_PRIVCMD_MMAPBATCH \
+ _IOC(_IOC_NONE, 'P', 3, sizeof(privcmd_mmapbatch_t))
+
+#endif /* __LINUX_PUBLIC_PRIVCMD_H__ */
--
1.5.4.1
linux-2.6-xen-0013-xen-Add-proc-xen-xenbus.patch:
--- NEW FILE linux-2.6-xen-0013-xen-Add-proc-xen-xenbus.patch ---
>From 6a0df620e0d6ae9ab22cdadb226f7da0b1282fac Mon Sep 17 00:00:00 2001
From: Mark McLoughlin <markmc at redhat.com>
Date: Mon, 4 Feb 2008 22:04:36 +0000
Subject: [PATCH] xen: Add /proc/xen/xenbus
This interface is used by userspace programs to talk to
xenstored.
Since xenstored makes itself available to Dom0 userspace
via a socket this should only really be useful in Domu,
but it turns out that Dom0 apps historically default
to using /proc/xen/xenbus rather than the socket.
Signed-off-by: Mark McLoughlin <markmc at redhat.com>
---
drivers/xen/xenbus/xenbus_comms.h | 1 -
drivers/xen/xenbus/xenbus_probe.c | 2 +
drivers/xen/xenbus/xenbus_xs.c | 1 +
drivers/xen/xenctrl/Makefile | 1 +
drivers/xen/xenctrl/main.c | 6 +
drivers/xen/xenctrl/xenbus.c | 398 +++++++++++++++++++++++++++++++++++++
drivers/xen/xenctrl/xenctrl.h | 6 +
include/xen/xenbus.h | 2 +
8 files changed, 416 insertions(+), 1 deletions(-)
create mode 100644 drivers/xen/xenctrl/xenbus.c
diff --git a/drivers/xen/xenbus/xenbus_comms.h b/drivers/xen/xenbus/xenbus_comms.h
index c21db75..fcc9b29 100644
--- a/drivers/xen/xenbus/xenbus_comms.h
+++ b/drivers/xen/xenbus/xenbus_comms.h
@@ -41,6 +41,5 @@ int xb_data_to_read(void);
int xb_wait_for_data_to_read(void);
int xs_input_avail(void);
extern struct xenstore_domain_interface *xen_store_interface;
-extern int xen_store_evtchn;
#endif /* _XENBUS_COMMS_H */
diff --git a/drivers/xen/xenbus/xenbus_probe.c b/drivers/xen/xenbus/xenbus_probe.c
index 336363c..759fdbc 100644
--- a/drivers/xen/xenbus/xenbus_probe.c
+++ b/drivers/xen/xenbus/xenbus_probe.c
@@ -56,6 +56,8 @@
#include "xenbus_probe.h"
int xen_store_evtchn;
+EXPORT_SYMBOL_GPL(xen_store_evtchn);
+
struct xenstore_domain_interface *xen_store_interface;
static unsigned long xen_store_mfn;
diff --git a/drivers/xen/xenbus/xenbus_xs.c b/drivers/xen/xenbus/xenbus_xs.c
index 227d53b..810e24a 100644
--- a/drivers/xen/xenbus/xenbus_xs.c
+++ b/drivers/xen/xenbus/xenbus_xs.c
@@ -184,6 +184,7 @@ void *xenbus_dev_request_and_reply(struct xsd_sockmsg *msg)
return ret;
}
+EXPORT_SYMBOL(xenbus_dev_request_and_reply);
/* Send message to xs, get kmalloc'ed reply. ERR_PTR() on error. */
static void *xs_talkv(struct xenbus_transaction t,
diff --git a/drivers/xen/xenctrl/Makefile b/drivers/xen/xenctrl/Makefile
index 8a706cb..23dafa3 100644
--- a/drivers/xen/xenctrl/Makefile
+++ b/drivers/xen/xenctrl/Makefile
@@ -4,3 +4,4 @@ xenctrl-objs =
xenctrl-objs += main.o
xenctrl-objs += capabilities.o
xenctrl-objs += privcmd.o
+xenctrl-objs += xenbus.o
diff --git a/drivers/xen/xenctrl/main.c b/drivers/xen/xenctrl/main.c
index d1fe6ef..b0cf61b 100644
--- a/drivers/xen/xenctrl/main.c
+++ b/drivers/xen/xenctrl/main.c
@@ -59,8 +59,13 @@ static int __init xenctrl_init(void)
if (ret)
goto fail2;
+ ret = xenbus_create_proc_entry();
+ if (ret)
+ goto fail3;
+
return 0;
+ fail3: privcmd_remove_proc_entry();
fail2: capabilities_remove_proc_entry();
fail1: remove_proc_entry("xen", NULL);
return ret;
@@ -68,6 +73,7 @@ static int __init xenctrl_init(void)
static void __exit xenctrl_exit(void)
{
+ xenbus_remove_proc_entry();
privcmd_remove_proc_entry();
capabilities_remove_proc_entry();
remove_proc_entry("xen", NULL);
diff --git a/drivers/xen/xenctrl/xenbus.c b/drivers/xen/xenctrl/xenbus.c
new file mode 100644
index 0000000..57d5501
--- /dev/null
+++ b/drivers/xen/xenctrl/xenbus.c
@@ -0,0 +1,398 @@
+/*
+ * xenbus.c
+ *
+ * /proc/xen/xenbus gives user-space access to the kernel's xenbus
+ * connection to xenstore.
+ *
+ * Copyright (c) 2005, Christian Limpach
+ * Copyright (c) 2005, Rusty Russell, IBM Corporation
+ *
+ * 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 <linux/proc_fs.h>
+#include <linux/module.h>
+#include <linux/uaccess.h>
+#include <linux/poll.h>
+
+#include <xen/xenbus.h>
+
+struct xenbus_dev_transaction {
+ struct list_head list;
+ struct xenbus_transaction handle;
+};
+
+struct read_buffer {
+ struct list_head list;
+ unsigned int cons;
+ unsigned int len;
+ char msg[];
+};
+
+struct xenbus_dev_data {
+ /* In-progress transaction. */
+ struct list_head transactions;
+
+ /* Active watches. */
+ struct list_head watches;
+
+ /* Partial request. */
+ unsigned int len;
+ union {
+ struct xsd_sockmsg msg;
+ char buffer[PAGE_SIZE];
+ } u;
+
+ /* Response queue. */
+ struct list_head read_buffers;
+ wait_queue_head_t read_waitq;
+
+ struct mutex reply_mutex;
+};
+
+static ssize_t xenbus_dev_read(struct file *filp,
+ char __user *ubuf,
+ size_t len, loff_t *ppos)
+{
+ struct xenbus_dev_data *u = filp->private_data;
+ struct read_buffer *rb;
+ int i, ret;
+
+ mutex_lock(&u->reply_mutex);
+ while (list_empty(&u->read_buffers)) {
+ mutex_unlock(&u->reply_mutex);
+ ret = wait_event_interruptible(u->read_waitq,
+ !list_empty(&u->read_buffers));
+ if (ret)
+ return ret;
+ mutex_lock(&u->reply_mutex);
+ }
+
+ rb = list_entry(u->read_buffers.next, struct read_buffer, list);
+ for (i = 0; i < len;) {
+ put_user(rb->msg[rb->cons], ubuf + i);
+ i++;
+ rb->cons++;
+ if (rb->cons == rb->len) {
+ list_del(&rb->list);
+ kfree(rb);
+ if (list_empty(&u->read_buffers))
+ break;
+ rb = list_entry(u->read_buffers.next,
+ struct read_buffer, list);
+ }
+ }
+ mutex_unlock(&u->reply_mutex);
+
+ return i;
+}
+
+static void queue_reply(struct xenbus_dev_data *u,
+ char *data, unsigned int len)
+{
+ struct read_buffer *rb;
+
+ if (len == 0)
+ return;
+
+ rb = kmalloc(sizeof(*rb) + len, GFP_KERNEL);
+ BUG_ON(rb == NULL);
+
+ rb->cons = 0;
+ rb->len = len;
+
+ memcpy(rb->msg, data, len);
+
+ list_add_tail(&rb->list, &u->read_buffers);
+
+ wake_up(&u->read_waitq);
+}
+
+struct watch_adapter
+{
+ struct list_head list;
+ struct xenbus_watch watch;
+ struct xenbus_dev_data *dev_data;
+ char *token;
+};
+
+static void free_watch_adapter(struct watch_adapter *watch)
+{
+ kfree(watch->watch.node);
+ kfree(watch->token);
+ kfree(watch);
+}
+
+static void watch_fired(struct xenbus_watch *watch,
+ const char **vec,
+ unsigned int len)
+{
+ struct watch_adapter *adap =
+ container_of(watch, struct watch_adapter, watch);
+ struct xsd_sockmsg hdr;
+ const char *path, *token;
+ int path_len, tok_len, body_len;
+
+ path = vec[XS_WATCH_PATH];
+ token = adap->token;
+
+ path_len = strlen(path) + 1;
+ tok_len = strlen(token) + 1;
+ body_len = path_len + tok_len;
+
+ hdr.type = XS_WATCH_EVENT;
+ hdr.len = body_len;
+
+ mutex_lock(&adap->dev_data->reply_mutex);
+ queue_reply(adap->dev_data, (char *)&hdr, sizeof(hdr));
+ queue_reply(adap->dev_data, (char *)path, path_len);
+ queue_reply(adap->dev_data, (char *)token, tok_len);
+ mutex_unlock(&adap->dev_data->reply_mutex);
+}
+
+static LIST_HEAD(watch_list);
+
+static ssize_t xenbus_dev_write(struct file *filp,
+ const char __user *ubuf,
+ size_t len, loff_t *ppos)
+{
+ struct xenbus_dev_data *u = filp->private_data;
+ struct xenbus_dev_transaction *trans = NULL;
+ uint32_t msg_type;
+ void *reply;
+ char *path, *token;
+ struct watch_adapter *watch, *tmp_watch;
+ int err, rc = len;
+
+ if ((len + u->len) > sizeof(u->u.buffer)) {
+ rc = -EINVAL;
+ goto out;
+ }
+
+ if (copy_from_user(u->u.buffer + u->len, ubuf, len) != 0) {
+ rc = -EFAULT;
+ goto out;
+ }
+
+ u->len += len;
+ if ((u->len < sizeof(u->u.msg)) ||
+ (u->len < (sizeof(u->u.msg) + u->u.msg.len)))
+ return rc;
+
+ msg_type = u->u.msg.type;
+
+ switch (msg_type) {
+ case XS_TRANSACTION_START:
+ case XS_TRANSACTION_END:
+ case XS_DIRECTORY:
+ case XS_READ:
+ case XS_GET_PERMS:
+ case XS_RELEASE:
+ case XS_GET_DOMAIN_PATH:
+ case XS_WRITE:
+ case XS_MKDIR:
+ case XS_RM:
+ case XS_SET_PERMS:
+ if (msg_type == XS_TRANSACTION_START) {
+ trans = kmalloc(sizeof(*trans), GFP_KERNEL);
+ if (!trans) {
+ rc = -ENOMEM;
+ goto out;
+ }
+ }
+
+ reply = xenbus_dev_request_and_reply(&u->u.msg);
+ if (IS_ERR(reply)) {
+ kfree(trans);
+ rc = PTR_ERR(reply);
+ goto out;
+ }
+
+ if (msg_type == XS_TRANSACTION_START) {
+ trans->handle.id = simple_strtoul(reply, NULL, 0);
+ list_add(&trans->list, &u->transactions);
+ } else if (msg_type == XS_TRANSACTION_END) {
+ list_for_each_entry(trans, &u->transactions, list)
+ if (trans->handle.id == u->u.msg.tx_id)
+ break;
+ BUG_ON(&trans->list == &u->transactions);
+ list_del(&trans->list);
+ kfree(trans);
+ }
+ mutex_lock(&u->reply_mutex);
+ queue_reply(u, (char *)&u->u.msg, sizeof(u->u.msg));
+ queue_reply(u, (char *)reply, u->u.msg.len);
+ mutex_unlock(&u->reply_mutex);
+ kfree(reply);
+ break;
+
+ case XS_WATCH:
+ case XS_UNWATCH: {
+ static const char *XS_RESP = "OK";
+ struct xsd_sockmsg hdr;
+
+ path = u->u.buffer + sizeof(u->u.msg);
+ token = memchr(path, 0, u->u.msg.len);
+ if (token == NULL) {
+ rc = -EILSEQ;
+ goto out;
+ }
+ token++;
+
+ if (msg_type == XS_WATCH) {
+ watch = kmalloc(sizeof(*watch), GFP_KERNEL);
+ watch->watch.node = kmalloc(strlen(path)+1,
+ GFP_KERNEL);
+ strcpy((char *)watch->watch.node, path);
+ watch->watch.callback = watch_fired;
+ watch->token = kmalloc(strlen(token)+1, GFP_KERNEL);
+ strcpy(watch->token, token);
+ watch->dev_data = u;
+
+ err = register_xenbus_watch(&watch->watch);
+ if (err) {
+ free_watch_adapter(watch);
+ rc = err;
+ goto out;
+ }
+
+ list_add(&watch->list, &u->watches);
+ } else {
+ list_for_each_entry_safe(watch, tmp_watch,
+ &u->watches, list) {
+ if (!strcmp(watch->token, token) &&
+ !strcmp(watch->watch.node, path))
+ {
+ unregister_xenbus_watch(&watch->watch);
+ list_del(&watch->list);
+ free_watch_adapter(watch);
+ break;
+ }
+ }
+ }
+
+ hdr.type = msg_type;
+ hdr.len = strlen(XS_RESP) + 1;
+ mutex_lock(&u->reply_mutex);
+ queue_reply(u, (char *)&hdr, sizeof(hdr));
+ queue_reply(u, (char *)XS_RESP, hdr.len);
+ mutex_unlock(&u->reply_mutex);
+ break;
+ }
+
+ default:
+ rc = -EINVAL;
+ break;
+ }
+
+ out:
+ u->len = 0;
+ return rc;
+}
+
+static int xenbus_dev_open(struct inode *inode, struct file *filp)
+{
+ struct xenbus_dev_data *u;
+
+ if (xen_store_evtchn == 0)
+ return -ENOENT;
+
+ nonseekable_open(inode, filp);
+
+ u = kzalloc(sizeof(*u), GFP_KERNEL);
+ if (u == NULL)
+ return -ENOMEM;
+
+ INIT_LIST_HEAD(&u->transactions);
+ INIT_LIST_HEAD(&u->watches);
+ INIT_LIST_HEAD(&u->read_buffers);
+ init_waitqueue_head(&u->read_waitq);
+
+ mutex_init(&u->reply_mutex);
+
+ filp->private_data = u;
+
+ return 0;
+}
+
+static int xenbus_dev_release(struct inode *inode, struct file *filp)
+{
+ struct xenbus_dev_data *u = filp->private_data;
+ struct xenbus_dev_transaction *trans, *tmp;
+ struct watch_adapter *watch, *tmp_watch;
+
+ list_for_each_entry_safe(trans, tmp, &u->transactions, list) {
+ xenbus_transaction_end(trans->handle, 1);
+ list_del(&trans->list);
+ kfree(trans);
+ }
+
+ list_for_each_entry_safe(watch, tmp_watch, &u->watches, list) {
+ unregister_xenbus_watch(&watch->watch);
+ list_del(&watch->list);
+ free_watch_adapter(watch);
+ }
+
+ kfree(u);
+
+ 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 (!list_empty(&u->read_buffers))
+ return POLLIN | POLLRDNORM;
+ return 0;
+}
+
+static const 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,
+};
+
+int __init xenbus_create_proc_entry(void)
+{
+ struct proc_dir_entry *entry;
+
+ entry = create_proc_entry("xen/xenbus", 0400, NULL);
+ if (!entry)
+ return -ENOMEM;
+
+ entry->owner = THIS_MODULE;
+ entry->proc_fops = &xenbus_dev_file_ops;
+
+ return 0;
+}
+
+void __exit xenbus_remove_proc_entry(void)
+{
+ remove_proc_entry("xen/xenbus", NULL);
+}
diff --git a/drivers/xen/xenctrl/xenctrl.h b/drivers/xen/xenctrl/xenctrl.h
index a35209a..e585c4b 100644
--- a/drivers/xen/xenctrl/xenctrl.h
+++ b/drivers/xen/xenctrl/xenctrl.h
@@ -43,3 +43,9 @@ void capabilities_remove_proc_entry(void) __exit;
*/
int privcmd_create_proc_entry(void) __init;
void privcmd_remove_proc_entry(void) __exit;
+
+/*
+ * xenbus.c
+ */
+int xenbus_create_proc_entry(void) __init;
+void xenbus_remove_proc_entry(void) __exit;
diff --git a/include/xen/xenbus.h b/include/xen/xenbus.h
index 6f7c290..10eae11 100644
--- a/include/xen/xenbus.h
+++ b/include/xen/xenbus.h
@@ -231,4 +231,6 @@ const char *xenbus_strstate(enum xenbus_state state);
int xenbus_dev_is_online(struct xenbus_device *dev);
int xenbus_frontend_closed(struct xenbus_device *dev);
+extern int xen_store_evtchn;
+
#endif /* _XEN_XENBUS_H */
--
1.5.4.1
linux-2.6-xen-0014-xen-Add-Xen-s-sys-hypervisor-interface.patch:
--- NEW FILE linux-2.6-xen-0014-xen-Add-Xen-s-sys-hypervisor-interface.patch ---
>From 54754bff4a3564e48821056f1134b1450cd0280e Mon Sep 17 00:00:00 2001
From: Mark McLoughlin <markmc at redhat.com>
Date: Thu, 7 Feb 2008 15:32:28 +0000
Subject: [PATCH] xen: Add Xen's /sys/hypervisor interface
Hook up Xen's /sys/hypervisor interface:
/sys/hypervisor/
-> type
-> uuid
-> compilation
-> compile_date
-> compiled_by
-> compiler
-> properties
-> capabilities
-> changeset
-> pagesize
-> virtual_start
-> writable_pt
-> version
-> extra
-> major
-> minor
Note: the hypervisor subsys hook requires that
SYS_HYPERVISOR is selected to enabled it, which in
turns means that the subsys will be registered by
a pv-ops kernel with Xen support, even on bare
metal. This hook needs to be changed to be runtime
enabled.
Signed-off-by: Mark McLoughlin <markmc at redhat.com>
---
arch/x86/xen/Kconfig | 3 +-
drivers/xen/xenctrl/Makefile | 1 +
drivers/xen/xenctrl/main.c | 6 +
drivers/xen/xenctrl/sysfs.c | 349 +++++++++++++++++++++++++++++++++++++++
drivers/xen/xenctrl/xenctrl.h | 6 +
include/xen/interface/version.h | 6 +
6 files changed, 370 insertions(+), 1 deletions(-)
create mode 100644 drivers/xen/xenctrl/sysfs.c
diff --git a/arch/x86/xen/Kconfig b/arch/x86/xen/Kconfig
index 4723bc1..ff6a56a 100644
--- a/arch/x86/xen/Kconfig
+++ b/arch/x86/xen/Kconfig
@@ -14,7 +14,8 @@ config XEN
config XENCTRL
tristate "Xen's user space control interfaces"
- depends on XEN && PROC_FS
+ depends on XEN && PROC_FS && SYSFS
default y if XEN
+ select SYS_HYPERVISOR
help
This is the /proc/xen interface used by Xen's libxc.
diff --git a/drivers/xen/xenctrl/Makefile b/drivers/xen/xenctrl/Makefile
index 23dafa3..e126e76 100644
--- a/drivers/xen/xenctrl/Makefile
+++ b/drivers/xen/xenctrl/Makefile
@@ -5,3 +5,4 @@ xenctrl-objs += main.o
xenctrl-objs += capabilities.o
xenctrl-objs += privcmd.o
xenctrl-objs += xenbus.o
+xenctrl-objs += sysfs.o
diff --git a/drivers/xen/xenctrl/main.c b/drivers/xen/xenctrl/main.c
index b0cf61b..87d0dba 100644
--- a/drivers/xen/xenctrl/main.c
+++ b/drivers/xen/xenctrl/main.c
@@ -63,8 +63,13 @@ static int __init xenctrl_init(void)
if (ret)
goto fail3;
+ ret = sys_hypervisor_init();
+ if (ret)
+ goto fail4;
+
return 0;
+ fail4: xenbus_remove_proc_entry();
fail3: privcmd_remove_proc_entry();
fail2: capabilities_remove_proc_entry();
fail1: remove_proc_entry("xen", NULL);
@@ -73,6 +78,7 @@ static int __init xenctrl_init(void)
static void __exit xenctrl_exit(void)
{
+ sys_hypervisor_exit();
xenbus_remove_proc_entry();
privcmd_remove_proc_entry();
capabilities_remove_proc_entry();
diff --git a/drivers/xen/xenctrl/sysfs.c b/drivers/xen/xenctrl/sysfs.c
new file mode 100644
index 0000000..8cbf4d6
--- /dev/null
+++ b/drivers/xen/xenctrl/sysfs.c
@@ -0,0 +1,349 @@
+/*
+ * copyright (c) 2006 IBM Corporation
+ * Authored by: Mike D. Day <ncmike at us.ibm.com>
+ *
+ * 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/kobject.h>
+#include <linux/sysfs.h>
+#include <linux/err.h>
+#include <asm/xen/hypervisor.h>
+#include <xen/xenbus.h>
+#include "xenctrl.h"
+
+#define HYPERVISOR_ATTR_RO(_name) \
+static struct kobj_attribute _name##_attr = __ATTR_RO(_name)
+
+#define HYPERVISOR_ATTR_RW(_name) \
+static struct kobj_attribute _name##_attr = \
+ __ATTR(_name, 0644, _name##_show, _name##_store)
+
+static ssize_t type_show(struct kobject *kobj, struct kobj_attribute *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_kobj, &type_attr.attr);
+}
+
+static void xen_sysfs_type_destroy(void)
+{
+ sysfs_remove_file(hypervisor_kobj, &type_attr.attr);
+}
+
+static ssize_t major_show(struct kobject *kobj, struct kobj_attribute *attr, char *buffer)
+{
+ int version;
+
+ version = HYPERVISOR_xen_version(XENVER_version, NULL);
+ if (!version)
+ return -ENODEV;
+
+ return sprintf(buffer, "%d\n", version >> 16);
+}
+
+HYPERVISOR_ATTR_RO(major);
+
+static ssize_t minor_show(struct kobject *kobj, struct kobj_attribute *attr, char *buffer)
+{
+ int version;
+
+ version = HYPERVISOR_xen_version(XENVER_version, NULL);
+ if (!version)
+ return -ENODEV;
+
+ return sprintf(buffer, "%d\n", version & 0xff);
+}
+
+HYPERVISOR_ATTR_RO(minor);
+
+static ssize_t extra_show(struct kobject *kobj, struct kobj_attribute *attr, char *buffer)
+{
+ int ret;
+ struct xen_extraversion extra;
+
+ ret = HYPERVISOR_xen_version(XENVER_extraversion, &extra);
+ if (ret)
+ return ret;
+
+ return sprintf(buffer, "%s\n", extra.extraversion);
+}
+
+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_kobj, &version_group);
+}
+
+static void xen_sysfs_version_destroy(void)
+{
+ sysfs_remove_group(hypervisor_kobj, &version_group);
+}
+
+static ssize_t uuid_show(struct kobject *kobj, struct kobj_attribute *attr, char *buffer)
+{
+ char *vm, *val;
+ int ret;
+
+ vm = xenbus_read(XBT_NIL, "vm", "", NULL);
+ if (IS_ERR(vm))
+ return PTR_ERR(vm);
+
+ val = xenbus_read(XBT_NIL, vm, "uuid", NULL);
+ if (IS_ERR(val)) {
+ ret = PTR_ERR(val);
+ goto out;
+ }
+
+ ret = sprintf(buffer, "%s\n", val);
+
+ kfree(val);
+out: kfree(vm);
+
+ return ret;
+}
+
+HYPERVISOR_ATTR_RO(uuid);
+
+static int __init xen_sysfs_uuid_init(void)
+{
+ return sysfs_create_file(hypervisor_kobj, &uuid_attr.attr);
+}
+
+static void xen_sysfs_uuid_destroy(void)
+{
+ sysfs_remove_file(hypervisor_kobj, &uuid_attr.attr);
+}
+
+static ssize_t compiler_show(struct kobject *kobj, struct kobj_attribute *attr, char *buffer)
+{
+ struct xen_compile_info info;
+ int ret;
+
+ ret = HYPERVISOR_xen_version(XENVER_compile_info, &info);
+ if (ret)
+ return ret;
+
+ return sprintf(buffer, "%s\n", info.compiler);
+}
+
+HYPERVISOR_ATTR_RO(compiler);
+
+static ssize_t compiled_by_show(struct kobject *kobj, struct kobj_attribute *attr, char *buffer)
+{
+ struct xen_compile_info info;
+ int ret;
+
+ ret = HYPERVISOR_xen_version(XENVER_compile_info, &info);
+ if (ret)
+ return ret;
+
+ return sprintf(buffer, "%s\n", info.compile_by);
+}
+
+HYPERVISOR_ATTR_RO(compiled_by);
+
+static ssize_t compile_date_show(struct kobject *kobj, struct kobj_attribute *attr, char *buffer)
+{
+ struct xen_compile_info info;
+ int ret;
+
+ ret = HYPERVISOR_xen_version(XENVER_compile_info, &info);
+ if (ret)
+ return ret;
+
+ return sprintf(buffer, "%s\n", info.compile_date);
+}
+
+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,
+};
+
+static int __init xen_compilation_init(void)
+{
+ return sysfs_create_group(hypervisor_kobj,
+ &xen_compilation_group);
+}
+
+static void xen_compilation_destroy(void)
+{
+ sysfs_remove_group(hypervisor_kobj,
+ &xen_compilation_group);
+}
+
+static ssize_t capabilities_show(struct kobject *kobj, struct kobj_attribute *attr, char *buffer)
+{
+ struct xen_capabilities_info *caps;
+ int ret;
+
+ caps = kmalloc(sizeof(struct xen_capabilities_info), GFP_KERNEL);
+ if (!caps)
+ return -ENOMEM;
+
+ ret = HYPERVISOR_xen_version(XENVER_capabilities, caps);
+ if (ret)
+ goto out;
+
+ ret = sprintf(buffer, "%s\n", caps->info);
+
+out: kfree(caps);
+
+ return ret;
+}
+
+HYPERVISOR_ATTR_RO(capabilities);
+
+static ssize_t changeset_show(struct kobject *kobj, struct kobj_attribute *attr, char *buffer)
+{
+ struct xen_changeset_info cset;
+ int ret;
+
+ ret = HYPERVISOR_xen_version(XENVER_changeset, &cset);
+ if (ret)
+ return ret;
+
+ return sprintf(buffer, "%s\n", cset.info);
+}
+
+HYPERVISOR_ATTR_RO(changeset);
+
+static ssize_t virtual_start_show(struct kobject *kobj, struct kobj_attribute *attr, char *buffer)
+{
+ struct xen_platform_parameters parms;
+ int ret;
+
+ ret = HYPERVISOR_xen_version(XENVER_platform_parameters, &parms);
+ if (ret)
+ return ret;
+
+ return sprintf(buffer, "%lx\n", parms.virt_start);
+}
+
+HYPERVISOR_ATTR_RO(virtual_start);
+
+static ssize_t pagesize_show(struct kobject *kobj, struct kobj_attribute *attr, char *buffer)
+{
+ int ret;
+
+ ret = HYPERVISOR_xen_version(XENVER_pagesize, NULL);
+ if (ret < 0)
+ return ret;
+
+ return sprintf(buffer, "%x\n", ret);
+}
+
+HYPERVISOR_ATTR_RO(pagesize);
+
+static ssize_t writable_pt_show(struct kobject *kobj, struct kobj_attribute *attr, char *buffer)
+{
+ struct xen_feature_info info;
+ int ret;
+
+ info.submap_idx = XENFEAT_writable_page_tables;
+
+ ret = HYPERVISOR_xen_version(XENVER_get_features, &info);
+ if (ret)
+ return ret;
+
+ return sprintf(buffer, "%d\n", info.submap);
+}
+
+HYPERVISOR_ATTR_RO(writable_pt);
+
+static struct attribute *xen_properties_attrs[] = {
+ &capabilities_attr.attr,
+ &changeset_attr.attr,
+ &virtual_start_attr.attr,
+ &pagesize_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_kobj,
+ &xen_properties_group);
+}
+
+static void xen_properties_destroy(void)
+{
+ sysfs_remove_group(hypervisor_kobj, &xen_properties_group);
+}
+
+int __init sys_hypervisor_init(void)
+{
+ int ret;
+
+ if (!is_running_on_xen())
+ return -ENODEV;
+
+ 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_sysfs_uuid_init();
+ if (ret)
+ goto uuid_out;
+ ret = xen_properties_init();
+ if (!ret)
+ goto out;
+
+ xen_sysfs_uuid_destroy();
+uuid_out:
+ xen_compilation_destroy();
+comp_out:
+ xen_sysfs_version_destroy();
+version_out:
+ xen_sysfs_type_destroy();
+out:
+ return ret;
+}
+
+void __exit sys_hypervisor_exit(void)
+{
+ xen_properties_destroy();
+ xen_compilation_destroy();
+ xen_sysfs_uuid_destroy();
+ xen_sysfs_version_destroy();
+ xen_sysfs_type_destroy();
+}
diff --git a/drivers/xen/xenctrl/xenctrl.h b/drivers/xen/xenctrl/xenctrl.h
index e585c4b..1afbdfb 100644
--- a/drivers/xen/xenctrl/xenctrl.h
+++ b/drivers/xen/xenctrl/xenctrl.h
@@ -49,3 +49,9 @@ void privcmd_remove_proc_entry(void) __exit;
*/
int xenbus_create_proc_entry(void) __init;
void xenbus_remove_proc_entry(void) __exit;
+
+/*
+ * sysfs.c
+ */
+int sys_hypervisor_init(void) __init;
+void sys_hypervisor_exit(void) __exit;
diff --git a/include/xen/interface/version.h b/include/xen/interface/version.h
index 453235e..dd58cf5 100644
--- a/include/xen/interface/version.h
+++ b/include/xen/interface/version.h
@@ -57,4 +57,10 @@ struct xen_feature_info {
/* Declares the features reported by XENVER_get_features. */
#include "features.h"
+/* arg == NULL; returns host memory page size. */
+#define XENVER_pagesize 7
+
+/* arg == xen_domain_handle_t. */
+#define XENVER_guest_handle 8
+
#endif /* __XEN_PUBLIC_VERSION_H__ */
--
1.5.4.1
linux-2.6-xen-0015-xen-debug-Add-xprintk-to-log-directly-via-hypercall.patch:
--- NEW FILE linux-2.6-xen-0015-xen-debug-Add-xprintk-to-log-directly-via-hypercall.patch ---
>From dc0daca424b10e5758a875d9dfe55dbf4fc7966e Mon Sep 17 00:00:00 2001
From: Stephen Tweedie <sct at redhat.com>
Date: Wed, 21 Nov 2007 18:40:31 +0000
Subject: [PATCH] xen debug: Add xprintk to log directly via hypercall
For early debugging, it is useful to have a way of doing debugging output
direct to the hypervisor without having to rely on console being fully
initialised.
Signed-off-by: Stephen Tweedie <sct at redhat.com>
---
arch/x86/xen/enlighten.c | 32 ++++++++++++++++++++++++++++++++
include/xen/hvc-console.h | 1 +
2 files changed, 33 insertions(+), 0 deletions(-)
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
index a94605e..e1702e1 100644
--- a/arch/x86/xen/enlighten.c
+++ b/arch/x86/xen/enlighten.c
@@ -33,6 +33,7 @@
#include <xen/interface/sched.h>
#include <xen/features.h>
#include <xen/page.h>
+#include <xen/hvc-console.h>
#include <asm/paravirt.h>
#include <asm/page.h>
@@ -142,6 +143,37 @@ static void __init xen_banner(void)
printk(KERN_INFO "Hypervisor signature: %s\n", xen_start_info->magic);
}
+static void kcons_write_dom0(const char *s, unsigned int count)
+{
+ int rc;
+
+ while ((count > 0) &&
+ ((rc = HYPERVISOR_console_io(
+ CONSOLEIO_write, count, (char *)s)) > 0)) {
+ count -= rc;
+ s += rc;
+ }
+}
+
+
+/*** Useful function for console debugging -- goes straight to Xen. ***/
+asmlinkage int xprintk(const char *fmt, ...)
+{
+ va_list args;
+ int printk_len;
+ static char printk_buf[1024];
+
+ /* Emit the output into the temporary buffer */
+ va_start(args, fmt);
+ printk_len = vsnprintf(printk_buf, sizeof(printk_buf), fmt, args);
+ va_end(args);
+
+ /* Send the processed output directly to Xen. */
+ kcons_write_dom0(printk_buf, printk_len);
+
+ return 0;
+}
+
static void xen_cpuid(unsigned int *ax, unsigned int *bx,
unsigned int *cx, unsigned int *dx)
{
diff --git a/include/xen/hvc-console.h b/include/xen/hvc-console.h
index 21c0ecf..cb7a3c9 100644
--- a/include/xen/hvc-console.h
+++ b/include/xen/hvc-console.h
@@ -2,5 +2,6 @@
#define XEN_HVC_CONSOLE_H
extern struct console xenboot_console;
+extern asmlinkage int xprintk(const char *fmt, ...);
#endif /* XEN_HVC_CONSOLE_H */
--
1.5.4.1
linux-2.6-xen-0016-xen-x86_64-Initial-x86_64-support-for-Xen-paravirt_.patch:
--- NEW FILE linux-2.6-xen-0016-xen-x86_64-Initial-x86_64-support-for-Xen-paravirt_.patch ---
>From c255dab2cece092ec17e85fc0186ae6ac667afd5 Mon Sep 17 00:00:00 2001
From: Mark McLoughlin <markmc at redhat.com>
Date: Tue, 4 Mar 2008 17:59:50 +0000
Subject: [PATCH] xen x86_64: Initial x86_64 support for Xen paravirt_ops
Signed-off-by: Eduardo Habkost <ehabkost at redhat.com>
Signed-off-by: Mark McLoughlin <markmc at redhat.com>
---
arch/x86/Kconfig | 3 +-
arch/x86/kernel/acpi/boot.c | 4 +-
arch/x86/kernel/apic_32.c | 4 +-
arch/x86/kernel/apic_64.c | 2 +-
arch/x86/kernel/asm-offsets_64.c | 15 +
arch/x86/kernel/early_printk.c | 5 +-
arch/x86/kernel/efi_64.c | 4 +-
arch/x86/kernel/entry_32.S | 83 +-----
arch/x86/kernel/entry_64.S | 72 ++++-
arch/x86/kernel/genapic_64.c | 12 +
arch/x86/kernel/head64.c | 4 +
arch/x86/kernel/head_64.S | 23 ++
arch/x86/kernel/hpet.c | 4 +-
arch/x86/kernel/io_apic_64.c | 2 +-
arch/x86/kernel/irq_64.c | 5 +
arch/x86/kernel/mpparse_32.c | 4 +-
arch/x86/kernel/mpparse_64.c | 4 +-
arch/x86/kernel/paravirt.c | 3 +
arch/x86/kernel/process_64.c | 9 +
arch/x86/kernel/setup64.c | 5 +
arch/x86/kernel/setup_64.c | 41 +++-
arch/x86/kernel/smpboot_64.c | 4 +-
arch/x86/kernel/vsyscall_64.c | 31 ++-
arch/x86/mach-visws/traps.c | 10 +-
arch/x86/mm/init_32.c | 2 +-
arch/x86/mm/init_64.c | 558 ++++++++++++++++++++++++++++++++--
arch/x86/mm/ioremap.c | 4 +-
arch/x86/mm/pgtable_32.c | 25 ++-
arch/x86/pci/mmconfig_32.c | 2 +-
arch/x86/vdso/vdso32-setup.c | 6 +-
arch/x86/xen/Kconfig | 1 -
arch/x86/xen/Makefile | 6 +
arch/x86/xen/enlighten.c | 268 +++++++++++-----
arch/x86/xen/entry.S | 5 +
arch/x86/xen/entry_32.S | 81 +++++
arch/x86/xen/entry_64.S | 68 ++++
arch/x86/xen/events.c | 13 +-
arch/x86/xen/genapic.c | 190 ++++++++++++
arch/x86/xen/init.h | 20 ++
arch/x86/xen/init_32.c | 3 +
arch/x86/xen/init_64.c | 181 +++++++++++
arch/x86/xen/mmu.c | 407 ++++++++++++++++++-------
arch/x86/xen/mmu.h | 46 ++--
arch/x86/xen/multicalls.c | 9 +-
arch/x86/xen/setup.c | 22 ++
arch/x86/xen/smp.c | 16 +
arch/x86/xen/xen-asm.S | 219 +++-----------
arch/x86/xen/xen-asm_32.S | 184 +++++++++++
arch/x86/xen/xen-asm_64.S | 75 +++++
arch/x86/xen/xen-head.S | 21 +-
arch/x86/xen/xen-ops.h | 11 +
drivers/acpi/thermal.c | 5 +
drivers/char/hvc_xen.c | 6 +
drivers/ieee1394/init_ohci1394_dma.c | 2 +-
drivers/serial/8250_early.c | 2 +-
include/asm-x86/asm-hack.h | 27 ++
include/asm-x86/cmpxchg_64.h | 36 +++
include/asm-x86/desc_defs.h | 4 +
include/asm-x86/fixmap_32.h | 22 +-
include/asm-x86/fixmap_64.h | 31 ++-
include/asm-x86/mmu_context_64.h | 6 +-
include/asm-x86/page_64.h | 2 +-
include/asm-x86/paravirt.h | 46 ++-
include/asm-x86/percpu.h | 32 ++
include/asm-x86/pgalloc_64.h | 69 ++++-
include/asm-x86/pgtable.h | 15 +-
include/asm-x86/pgtable_64.h | 3 +-
include/asm-x86/proto.h | 1 +
include/asm-x86/smp_64.h | 3 +
include/asm-x86/system.h | 3 +-
include/asm-x86/xen/hypercall.h | 205 ++++++++++---
include/asm-x86/xen/hypervisor.h | 3 -
include/asm-x86/xen/interface.h | 35 ++-
include/linux/dmi.h | 1 +
include/linux/elfnote.h | 2 +-
include/xen/events.h | 2 +
include/xen/interface/elfnote.h | 16 +
include/xen/page.h | 34 ++-
init/main.c | 10 +
mm/slab.c | 8 +-
80 files changed, 2759 insertions(+), 668 deletions(-)
create mode 100644 arch/x86/xen/entry.S
create mode 100644 arch/x86/xen/entry_32.S
create mode 100644 arch/x86/xen/entry_64.S
create mode 100644 arch/x86/xen/genapic.c
create mode 100644 arch/x86/xen/init.h
create mode 100644 arch/x86/xen/init_32.c
create mode 100644 arch/x86/xen/init_64.c
create mode 100644 arch/x86/xen/xen-asm_32.S
create mode 100644 arch/x86/xen/xen-asm_64.S
create mode 100644 include/asm-x86/asm-hack.h
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index f41c953..6f466aa 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -92,7 +92,7 @@ config ARCH_MAY_HAVE_PC_FDC
def_bool y
config DMI
- def_bool y
+ def_bool !XEN
config RWSEM_GENERIC_SPINLOCK
def_bool !X86_XADD
@@ -330,6 +330,7 @@ config X86_RDC321X
config X86_VSMP
bool "Support for ScaleMP vSMP"
+ depends on !XEN
depends on X86_64 && PCI
help
Support for ScaleMP vSMP systems. Say 'Y' here if this kernel is
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
index 2cdc9de..cfc79ac 100644
--- a/arch/x86/kernel/acpi/boot.c
+++ b/arch/x86/kernel/acpi/boot.c
@@ -141,7 +141,7 @@ char *__init __acpi_map_table(unsigned long phys, unsigned long size)
offset = phys & (PAGE_SIZE - 1);
mapped_size = PAGE_SIZE - offset;
- set_fixmap(FIX_ACPI_END, phys);
+ set_fixmap_ma(FIX_ACPI_END, phys);
base = fix_to_virt(FIX_ACPI_END);
/*
@@ -152,7 +152,7 @@ char *__init __acpi_map_table(unsigned long phys, unsigned long size)
if (--idx < FIX_ACPI_BEGIN)
return NULL; /* cannot handle this */
phys += PAGE_SIZE;
- set_fixmap(idx, phys);
+ set_fixmap_ma(idx, phys);
mapped_size += PAGE_SIZE;
}
diff --git a/arch/x86/kernel/apic_32.c b/arch/x86/kernel/apic_32.c
index 35a568e..40fc1b3 100644
--- a/arch/x86/kernel/apic_32.c
+++ b/arch/x86/kernel/apic_32.c
@@ -1138,7 +1138,7 @@ void __init init_apic_mappings(void)
} else
apic_phys = mp_lapic_addr;
- set_fixmap_nocache(FIX_APIC_BASE, apic_phys);
+ set_fixmap_ma_nocache(FIX_APIC_BASE, apic_phys);
printk(KERN_DEBUG "mapped APIC to %08lx (%08lx)\n", APIC_BASE,
apic_phys);
@@ -1172,7 +1172,7 @@ fake_ioapic_page:
alloc_bootmem_pages(PAGE_SIZE);
ioapic_phys = __pa(ioapic_phys);
}
- set_fixmap_nocache(idx, ioapic_phys);
+ set_fixmap_ma_nocache(idx, ioapic_phys);
printk(KERN_DEBUG "mapped IOAPIC to %08lx (%08lx)\n",
__fix_to_virt(idx), ioapic_phys);
idx++;
diff --git a/arch/x86/kernel/apic_64.c b/arch/x86/kernel/apic_64.c
index d8d03e0..a611520 100644
--- a/arch/x86/kernel/apic_64.c
+++ b/arch/x86/kernel/apic_64.c
@@ -877,7 +877,7 @@ void __init init_apic_mappings(void)
} else
apic_phys = mp_lapic_addr;
- set_fixmap_nocache(FIX_APIC_BASE, apic_phys);
+ set_fixmap_ma_nocache(FIX_APIC_BASE, apic_phys);
apic_printk(APIC_VERBOSE, "mapped APIC to %16lx (%16lx)\n",
APIC_BASE, apic_phys);
diff --git a/arch/x86/kernel/asm-offsets_64.c b/arch/x86/kernel/asm-offsets_64.c
index 494e1e0..d0fabfd 100644
--- a/arch/x86/kernel/asm-offsets_64.c
+++ b/arch/x86/kernel/asm-offsets_64.c
@@ -25,6 +25,8 @@
#define OFFSET(sym, str, mem) \
DEFINE(sym, offsetof(struct str, mem))
+#include <xen/interface/xen.h>
+
#define __NO_STUBS 1
#undef __SYSCALL
#undef _ASM_X86_64_UNISTD_H_
@@ -92,6 +94,13 @@ int main(void)
offsetof (struct rt_sigframe32, uc.uc_mcontext));
BLANK();
#endif
+
+#ifdef CONFIG_XEN
+ BLANK();
+ OFFSET(XEN_vcpu_info_mask, vcpu_info, evtchn_upcall_mask);
[...5539 lines suppressed...]
-#define ELFNOTE(name, type, desc) \
+#define ELFNOTE(name, type, desc...) \
ELFNOTE_START(name, type, "") \
desc ; \
ELFNOTE_END
diff --git a/include/xen/events.h b/include/xen/events.h
index 2bde54d..c18d2bf 100644
--- a/include/xen/events.h
+++ b/include/xen/events.h
@@ -3,6 +3,8 @@
#include <linux/interrupt.h>
+#include <asm/xen/interface.h>
+#include <xen/interface/xen.h>
#include <xen/interface/event_channel.h>
#include <asm/xen/hypercall.h>
diff --git a/include/xen/interface/elfnote.h b/include/xen/interface/elfnote.h
index a64d3df..ee5501d 100644
--- a/include/xen/interface/elfnote.h
+++ b/include/xen/interface/elfnote.h
@@ -120,6 +120,22 @@
*/
#define XEN_ELFNOTE_BSD_SYMTAB 11
+/*
+ * The lowest address the hypervisor hole can begin at (numeric).
+ *
+ * This must not be set higher than HYPERVISOR_VIRT_START. Its presence
+ * also indicates to the hypervisor that the kernel can deal with the
+ * hole starting at a higher address.
+ */
+#define XEN_ELFNOTE_HV_START_LOW 12
+
+/*
+ * List of maddr_t-sized mask/value pairs describing how to recognize
+ * (non-present) L1 page table entries carrying valid MFNs (numeric).
+ */
+#define XEN_ELFNOTE_L1_MFN_VALID 13
+
+
#endif /* __XEN_PUBLIC_ELFNOTE_H__ */
/*
diff --git a/include/xen/page.h b/include/xen/page.h
index 031ef22..158fb60 100644
--- a/include/xen/page.h
+++ b/include/xen/page.h
@@ -8,6 +8,10 @@
#include <xen/features.h>
+#include <asm/xen/interface.h>
+
+#include <xen/hvc-console.h>
+
#ifdef CONFIG_X86_PAE
/* Xen machine address */
typedef struct xmaddr {
@@ -70,6 +74,8 @@ static inline unsigned long mfn_to_pfn(unsigned long mfn)
#endif
pfn = 0;
+ //xprintk("mfn_to_pfn(%lx):\n", mfn);
+
/*
* The array access can fail (e.g., device space beyond end of RAM).
* In such cases it doesn't matter what we return (we return garbage),
@@ -77,6 +83,7 @@ static inline unsigned long mfn_to_pfn(unsigned long mfn)
*/
__get_user(pfn, &machine_to_phys_mapping[mfn]);
+ //xprintk("mfn_to_pfn(%lx) = %lx\n", mfn, pfn);
return pfn;
}
@@ -143,34 +150,29 @@ static inline void set_phys_to_machine(unsigned long pfn, unsigned long mfn)
static inline pte_t mfn_pte(unsigned long page_nr, pgprot_t pgprot)
{
- pte_t pte;
-
- pte.pte_high = (page_nr >> (32 - PAGE_SHIFT)) |
- (pgprot_val(pgprot) >> 32);
- pte.pte_high &= (__supported_pte_mask >> 32);
- pte.pte_low = ((page_nr << PAGE_SHIFT) | pgprot_val(pgprot));
- pte.pte_low &= __supported_pte_mask;
-
- return pte;
+ pteval_t val;
+
+ val = (page_nr << PAGE_SHIFT) | pgprot_val(pgprot);
+ val &= __supported_pte_mask;
+ return native_make_pte(val);
}
-static inline unsigned long long pte_val_ma(pte_t x)
+static inline pteval_t pte_val_ma(pte_t x)
{
- return x.pte;
+ return native_pte_val(x);
}
-#define pmd_val_ma(v) ((v).pmd)
-#define pud_val_ma(v) ((v).pgd.pgd)
-#define __pte_ma(x) ((pte_t) { .pte = (x) })
+#define __pte_ma(x) (native_make_pte(x))
#define __pmd_ma(x) ((pmd_t) { (x) } )
#else /* !X86_PAE */
-#define pte_mfn(_pte) ((_pte).pte_low >> PAGE_SHIFT)
+#define pte_mfn(_pte) ((native_pte_val(_pte) & __PHYSICAL_MASK) >> PAGE_SHIFT)
#define mfn_pte(pfn, prot) __pte_ma(((pfn) << PAGE_SHIFT) | pgprot_val(prot))
#define pte_val_ma(x) ((x).pte)
-#define pmd_val_ma(v) ((v).pud.pgd.pgd)
#define __pte_ma(x) ((pte_t) { (x) } )
#endif /* CONFIG_X86_PAE */
#define pgd_val_ma(x) ((x).pgd)
+#define pmd_val_ma(x) (native_pmd_val((x)))
+#define pud_val_ma(x) (native_pud_val((x)))
xmaddr_t arbitrary_virt_to_machine(unsigned long address);
diff --git a/init/main.c b/init/main.c
index 80f5aaf..4a84f60 100644
--- a/init/main.c
+++ b/init/main.c
@@ -590,17 +590,25 @@ asmlinkage void __init start_kernel(void)
rcu_init();
init_IRQ();
pidhash_init();
+ printk("init_timers:\n");
init_timers();
hrtimers_init();
softirq_init();
+ printk("timekeeping:\n");
timekeeping_init();
+ printk("time:\n");
time_init();
+ printk("profile:\n");
profile_init();
+ printk("irqs_disabled:\n");
if (!irqs_disabled())
printk("start_kernel(): bug: interrupts were enabled early\n");
+ printk("early_boot_irqs_on:\n");
early_boot_irqs_on();
+ printk("local_irq_enable:\n");
local_irq_enable();
+ printk("console_init:\n");
/*
* HACK ALERT! This is early. We're enabling the console before
* we've done PCI setups etc, and console_init() must be aware of
@@ -637,7 +645,9 @@ asmlinkage void __init start_kernel(void)
numa_policy_init();
if (late_time_init)
late_time_init();
+ printk("calibrate_delay:\n");
calibrate_delay();
+ printk("pidmap_init:\n");
pidmap_init();
pgtable_cache_init();
prio_tree_init();
diff --git a/mm/slab.c b/mm/slab.c
index e499669..c18daa3 100644
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -3202,6 +3202,8 @@ static inline void *____cache_alloc(struct kmem_cache *cachep, gfp_t flags)
STATS_INC_ALLOCHIT(cachep);
ac->touched = 1;
objp = ac->entry[--ac->avail];
+ if (!objp)
+ printk("really weird: avail objp for cache %s is null\n", cachep->name);
} else {
STATS_INC_ALLOCMISS(cachep);
objp = cache_alloc_refill(cachep, flags);
@@ -3464,8 +3466,10 @@ __cache_alloc(struct kmem_cache *cachep, gfp_t flags, void *caller)
unsigned long save_flags;
void *objp;
- if (should_failslab(cachep, flags))
+ if (should_failslab(cachep, flags)) {
+ printk("cache %s should fail\n", cachep->name);
return NULL;
+ }
cache_alloc_debugcheck_before(cachep, flags);
local_irq_save(save_flags);
@@ -3477,6 +3481,8 @@ __cache_alloc(struct kmem_cache *cachep, gfp_t flags, void *caller)
if (unlikely((flags & __GFP_ZERO) && objp))
memset(objp, 0, obj_size(cachep));
+ if (!objp)
+ printk("allocation from cache %s failed!!!\n", cachep->name);
return objp;
}
--
1.5.4.1
Index: config-xen-generic
===================================================================
RCS file: /cvs/pkgs/rpms/kernel-xen-2.6/devel/config-xen-generic,v
retrieving revision 1.2.4.3
retrieving revision 1.2.4.4
diff -u -r1.2.4.3 -r1.2.4.4
--- config-xen-generic 5 Mar 2008 14:01:21 -0000 1.2.4.3
+++ config-xen-generic 6 Mar 2008 10:40:29 -0000 1.2.4.4
@@ -1,4 +1,5 @@
CONFIG_XEN=y
+CONFIG_XENCTRL=y
CONFIG_HVC_XEN=y
CONFIG_XEN_BLKDEV_FRONTEND=m
CONFIG_XEN_NETDEV_FRONTEND=m
Index: kernel.spec
===================================================================
RCS file: /cvs/pkgs/rpms/kernel-xen-2.6/devel/kernel.spec,v
retrieving revision 1.11.2.14
retrieving revision 1.11.2.15
diff -u -r1.11.2.14 -r1.11.2.15
--- kernel.spec 5 Mar 2008 18:41:17 -0000 1.11.2.14
+++ kernel.spec 6 Mar 2008 10:40:29 -0000 1.11.2.15
@@ -679,9 +679,14 @@
Patch5005: linux-2.6-xen-0006-xen-pvfb-Para-virtual-framebuffer-keyboard-and-poi.patch
Patch5006: linux-2.6-xen-0007-xen-Module-autoprobing-support-for-frontend-drivers.patch
Patch5007: linux-2.6-xen-0008-xen-Add-compatibility-aliases-for-frontend-drivers.patch
-Patch5008: linux-2.6-xen-0009-xen-dom0-Add-a-vmlinuz-target.patch
-Patch5009: linux-2.6-xen-0010-xen-debug-Add-xprintk-to-log-directly-via-hypercall.patch
-Patch5010: linux-2.6-xen-0011-xen-x86_64-Initial-x86_64-support-for-Xen-paravirt_.patch
+Patch5008: linux-2.6-xen-0009-xen-Add-a-vmlinuz-target.patch
+Patch5009: linux-2.6-xen-0010-xen-Add-empty-xenctrl-module.patch
+Patch5010: linux-2.6-xen-0011-xen-Add-proc-xen-capabilities.patch
+Patch5011: linux-2.6-xen-0012-xen-Add-proc-xen-privcmd.patch
+Patch5012: linux-2.6-xen-0013-xen-Add-proc-xen-xenbus.patch
+Patch5013: linux-2.6-xen-0014-xen-Add-Xen-s-sys-hypervisor-interface.patch
+Patch5014: linux-2.6-xen-0015-xen-debug-Add-xprintk-to-log-directly-via-hypercall.patch
+Patch5015: linux-2.6-xen-0016-xen-x86_64-Initial-x86_64-support-for-Xen-paravirt_.patch
# kernel-xen patches end
# Xen hypervisor patches (20000+)
@@ -1236,10 +1241,15 @@
ApplyPatch linux-2.6-xen-0006-xen-pvfb-Para-virtual-framebuffer-keyboard-and-poi.patch
ApplyPatch linux-2.6-xen-0007-xen-Module-autoprobing-support-for-frontend-drivers.patch
ApplyPatch linux-2.6-xen-0008-xen-Add-compatibility-aliases-for-frontend-drivers.patch
-ApplyPatch linux-2.6-xen-0009-xen-dom0-Add-a-vmlinuz-target.patch
-ApplyPatch linux-2.6-xen-0010-xen-debug-Add-xprintk-to-log-directly-via-hypercall.patch
+ApplyPatch linux-2.6-xen-0009-xen-Add-a-vmlinuz-target.patch
+ApplyPatch linux-2.6-xen-0010-xen-Add-empty-xenctrl-module.patch
+ApplyPatch linux-2.6-xen-0011-xen-Add-proc-xen-capabilities.patch
+ApplyPatch linux-2.6-xen-0012-xen-Add-proc-xen-privcmd.patch
+ApplyPatch linux-2.6-xen-0013-xen-Add-proc-xen-xenbus.patch
+ApplyPatch linux-2.6-xen-0014-xen-Add-Xen-s-sys-hypervisor-interface.patch
+ApplyPatch linux-2.6-xen-0015-xen-debug-Add-xprintk-to-log-directly-via-hypercall.patch
%ifarch x86_64
-ApplyPatch linux-2.6-xen-0011-xen-x86_64-Initial-x86_64-support-for-Xen-paravirt_.patch
+ApplyPatch linux-2.6-xen-0016-xen-x86_64-Initial-x86_64-support-for-Xen-paravirt_.patch
%endif
# kernel-xen apply end
@@ -1841,6 +1851,9 @@
%kernel_variant_files -a /%{image_install_path}/xen*-%{KVERREL} -e /etc/ld.so.conf.d/kernelcap-%{KVERREL}.conf %{with_xen} xen
%changelog
+* Thu Mar 05 2008 Mark McLoughlin <markmc at redhat.com>
+- Add /proc/xen and /sys/hypervisor
+
* Wed Mar 05 2008 Mark McLoughlin <markmc at redhat.com>
- Re-base to kernel-2_6_25-0_93_rc4_fc9
--- linux-2.6-xen-0009-xen-dom0-Add-a-vmlinuz-target.patch DELETED ---
--- linux-2.6-xen-0010-xen-debug-Add-xprintk-to-log-directly-via-hypercall.patch DELETED ---
--- linux-2.6-xen-0011-xen-x86_64-Initial-x86_64-support-for-Xen-paravirt_.patch DELETED ---
More information about the fedora-extras-commits
mailing list