Commit d8414d3c authored by Bastian Blank's avatar Bastian Blank Committed by Konrad Rzeszutek Wilk

xen: Add privcmd device driver

Access to arbitrary hypercalls is currently provided via xenfs. This
adds a standard character device to handle this. The support in xenfs
remains for backward compatibility and uses the device driver code.
Signed-off-by: default avatarBastian Blank <waldi@debian.org>
Acked-by: default avatarIan Campbell <ian.campbell@citrix.com>
Signed-off-by: default avatarKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
parent 243082e0
...@@ -86,6 +86,7 @@ config XEN_BACKEND ...@@ -86,6 +86,7 @@ config XEN_BACKEND
config XENFS config XENFS
tristate "Xen filesystem" tristate "Xen filesystem"
select XEN_PRIVCMD
default y default y
help help
The xen filesystem provides a way for domains to share The xen filesystem provides a way for domains to share
...@@ -171,4 +172,10 @@ config XEN_PCIDEV_BACKEND ...@@ -171,4 +172,10 @@ config XEN_PCIDEV_BACKEND
xen-pciback.hide=(03:00.0)(04:00.0) xen-pciback.hide=(03:00.0)(04:00.0)
If in doubt, say m. If in doubt, say m.
config XEN_PRIVCMD
tristate
depends on XEN
default m
endmenu endmenu
...@@ -19,7 +19,9 @@ obj-$(CONFIG_XEN_TMEM) += tmem.o ...@@ -19,7 +19,9 @@ obj-$(CONFIG_XEN_TMEM) += tmem.o
obj-$(CONFIG_SWIOTLB_XEN) += swiotlb-xen.o obj-$(CONFIG_SWIOTLB_XEN) += swiotlb-xen.o
obj-$(CONFIG_XEN_DOM0) += pci.o obj-$(CONFIG_XEN_DOM0) += pci.o
obj-$(CONFIG_XEN_PCIDEV_BACKEND) += xen-pciback/ obj-$(CONFIG_XEN_PCIDEV_BACKEND) += xen-pciback/
obj-$(CONFIG_XEN_PRIVCMD) += xen-privcmd.o
xen-evtchn-y := evtchn.o xen-evtchn-y := evtchn.o
xen-gntdev-y := gntdev.o xen-gntdev-y := gntdev.o
xen-gntalloc-y := gntalloc.o xen-gntalloc-y := gntalloc.o
xen-privcmd-y := privcmd.o
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/string.h> #include <linux/string.h>
...@@ -18,6 +19,7 @@ ...@@ -18,6 +19,7 @@
#include <linux/highmem.h> #include <linux/highmem.h>
#include <linux/pagemap.h> #include <linux/pagemap.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/miscdevice.h>
#include <asm/pgalloc.h> #include <asm/pgalloc.h>
#include <asm/pgtable.h> #include <asm/pgtable.h>
...@@ -32,6 +34,10 @@ ...@@ -32,6 +34,10 @@
#include <xen/page.h> #include <xen/page.h>
#include <xen/xen-ops.h> #include <xen/xen-ops.h>
#include "privcmd.h"
MODULE_LICENSE("GPL");
#ifndef HAVE_ARCH_PRIVCMD_MMAP #ifndef HAVE_ARCH_PRIVCMD_MMAP
static int privcmd_enforce_singleshot_mapping(struct vm_area_struct *vma); static int privcmd_enforce_singleshot_mapping(struct vm_area_struct *vma);
#endif #endif
...@@ -394,7 +400,38 @@ static int privcmd_enforce_singleshot_mapping(struct vm_area_struct *vma) ...@@ -394,7 +400,38 @@ static int privcmd_enforce_singleshot_mapping(struct vm_area_struct *vma)
} }
#endif #endif
const struct file_operations privcmd_file_ops = { const struct file_operations xen_privcmd_fops = {
.owner = THIS_MODULE,
.unlocked_ioctl = privcmd_ioctl, .unlocked_ioctl = privcmd_ioctl,
.mmap = privcmd_mmap, .mmap = privcmd_mmap,
}; };
EXPORT_SYMBOL_GPL(xen_privcmd_fops);
static struct miscdevice privcmd_dev = {
.minor = MISC_DYNAMIC_MINOR,
.name = "xen/privcmd",
.fops = &xen_privcmd_fops,
};
static int __init privcmd_init(void)
{
int err;
if (!xen_domain())
return -ENODEV;
err = misc_register(&privcmd_dev);
if (err != 0) {
printk(KERN_ERR "Could not register Xen privcmd device\n");
return err;
}
return 0;
}
static void __exit privcmd_exit(void)
{
misc_deregister(&privcmd_dev);
}
module_init(privcmd_init);
module_exit(privcmd_exit);
#include <linux/fs.h>
extern const struct file_operations xen_privcmd_fops;
obj-$(CONFIG_XENFS) += xenfs.o obj-$(CONFIG_XENFS) += xenfs.o
xenfs-y = super.o xenbus.o privcmd.o xenfs-y = super.o xenbus.o
xenfs-$(CONFIG_XEN_DOM0) += xenstored.o xenfs-$(CONFIG_XEN_DOM0) += xenstored.o
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include <xen/xen.h> #include <xen/xen.h>
#include "xenfs.h" #include "xenfs.h"
#include "../privcmd.h"
#include <asm/xen/hypervisor.h> #include <asm/xen/hypervisor.h>
...@@ -84,7 +85,7 @@ static int xenfs_fill_super(struct super_block *sb, void *data, int silent) ...@@ -84,7 +85,7 @@ static int xenfs_fill_super(struct super_block *sb, void *data, int silent)
[1] = {}, [1] = {},
{ "xenbus", &xenbus_file_ops, S_IRUSR|S_IWUSR }, { "xenbus", &xenbus_file_ops, S_IRUSR|S_IWUSR },
{ "capabilities", &capabilities_file_ops, S_IRUGO }, { "capabilities", &capabilities_file_ops, S_IRUGO },
{ "privcmd", &privcmd_file_ops, S_IRUSR|S_IWUSR }, { "privcmd", &xen_privcmd_fops, S_IRUSR|S_IWUSR },
{""}, {""},
}; };
int rc; int rc;
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
#define _XENFS_XENBUS_H #define _XENFS_XENBUS_H
extern const struct file_operations xenbus_file_ops; extern const struct file_operations xenbus_file_ops;
extern const struct file_operations privcmd_file_ops;
extern const struct file_operations xsd_kva_file_ops; extern const struct file_operations xsd_kva_file_ops;
extern const struct file_operations xsd_port_file_ops; extern const struct file_operations xsd_port_file_ops;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment