Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+7 −0
Original line number Original line Diff line number Diff line
@@ -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
	  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
+2 −0
Original line number Original line Diff line number Diff line
@@ -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
+38 −1
Original line number Original line Diff line number Diff line
@@ -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 @@
#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 @@
#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)
}
}
#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);

drivers/xen/privcmd.h

0 → 100644
+3 −0
Original line number Original line Diff line number Diff line
#include <linux/fs.h>

extern const struct file_operations xen_privcmd_fops;
+1 −1
Original line number Original line Diff line number Diff line
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
Loading