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: Bastian Blank <waldi@debian.org> Acked-by: Ian Campbell <ian.campbell@citrix.com> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
This commit is contained in:
parent
243082e0d5
commit
d8414d3c15
7 changed files with 53 additions and 4 deletions
|
@ -86,6 +86,7 @@ config XEN_BACKEND
|
|||
|
||||
config XENFS
|
||||
tristate "Xen filesystem"
|
||||
select XEN_PRIVCMD
|
||||
default y
|
||||
help
|
||||
The xen filesystem provides a way for domains to share
|
||||
|
@ -171,4 +172,10 @@ config XEN_PCIDEV_BACKEND
|
|||
xen-pciback.hide=(03:00.0)(04:00.0)
|
||||
|
||||
If in doubt, say m.
|
||||
|
||||
config XEN_PRIVCMD
|
||||
tristate
|
||||
depends on XEN
|
||||
default m
|
||||
|
||||
endmenu
|
||||
|
|
|
@ -19,7 +19,9 @@ obj-$(CONFIG_XEN_TMEM) += tmem.o
|
|||
obj-$(CONFIG_SWIOTLB_XEN) += swiotlb-xen.o
|
||||
obj-$(CONFIG_XEN_DOM0) += pci.o
|
||||
obj-$(CONFIG_XEN_PCIDEV_BACKEND) += xen-pciback/
|
||||
obj-$(CONFIG_XEN_PRIVCMD) += xen-privcmd.o
|
||||
|
||||
xen-evtchn-y := evtchn.o
|
||||
xen-gntdev-y := gntdev.o
|
||||
xen-gntalloc-y := gntalloc.o
|
||||
xen-privcmd-y := privcmd.o
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/string.h>
|
||||
|
@ -18,6 +19,7 @@
|
|||
#include <linux/highmem.h>
|
||||
#include <linux/pagemap.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/miscdevice.h>
|
||||
|
||||
#include <asm/pgalloc.h>
|
||||
#include <asm/pgtable.h>
|
||||
|
@ -32,6 +34,10 @@
|
|||
#include <xen/page.h>
|
||||
#include <xen/xen-ops.h>
|
||||
|
||||
#include "privcmd.h"
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
#ifndef HAVE_ARCH_PRIVCMD_MMAP
|
||||
static int privcmd_enforce_singleshot_mapping(struct vm_area_struct *vma);
|
||||
#endif
|
||||
|
@ -394,7 +400,38 @@ static int privcmd_enforce_singleshot_mapping(struct vm_area_struct *vma)
|
|||
}
|
||||
#endif
|
||||
|
||||
const struct file_operations privcmd_file_ops = {
|
||||
const struct file_operations xen_privcmd_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.unlocked_ioctl = privcmd_ioctl,
|
||||
.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);
|
3
drivers/xen/privcmd.h
Normal file
3
drivers/xen/privcmd.h
Normal file
|
@ -0,0 +1,3 @@
|
|||
#include <linux/fs.h>
|
||||
|
||||
extern const struct file_operations xen_privcmd_fops;
|
|
@ -1,4 +1,4 @@
|
|||
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
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#include <xen/xen.h>
|
||||
|
||||
#include "xenfs.h"
|
||||
#include "../privcmd.h"
|
||||
|
||||
#include <asm/xen/hypervisor.h>
|
||||
|
||||
|
@ -84,7 +85,7 @@ static int xenfs_fill_super(struct super_block *sb, void *data, int silent)
|
|||
[1] = {},
|
||||
{ "xenbus", &xenbus_file_ops, S_IRUSR|S_IWUSR },
|
||||
{ "capabilities", &capabilities_file_ops, S_IRUGO },
|
||||
{ "privcmd", &privcmd_file_ops, S_IRUSR|S_IWUSR },
|
||||
{ "privcmd", &xen_privcmd_fops, S_IRUSR|S_IWUSR },
|
||||
{""},
|
||||
};
|
||||
int rc;
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
#define _XENFS_XENBUS_H
|
||||
|
||||
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_port_file_ops;
|
||||
|
||||
|
|
Loading…
Reference in a new issue