[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[XenPPC] [pushed] [ppc] support "version" hcalls, and hcalls from 32-bit userland



# HG changeset patch
# User Hollis Blanchard <hollisb@xxxxxxxxxx>
# Node ID de3e1e3bba227f0f744edc3cb685d478e15bc869
# Parent  11e1dcb7a976f21bc80929aa74bac3216a406a40
[ppc] support "version" hcalls, and hcalls from 32-bit userland
Signed-off-by: Hollis Blanchard <hollisb@xxxxxxxxxx>

diff -r 11e1dcb7a976 -r de3e1e3bba22 arch/powerpc/platforms/xen/hcall.c
--- a/arch/powerpc/platforms/xen/hcall.c        Tue May 16 17:25:06 2006 -0500
+++ b/arch/powerpc/platforms/xen/hcall.c        Fri May 19 15:08:40 2006 -0500
@@ -6,18 +6,14 @@
 #include <xen/interface/dom0_ops.h>
 #include <xen/interface/memory.h>
 #include <xen/interface/xencomm.h>
+#include <xen/interface/version.h>
 #include <xen/public/privcmd.h>
 #include <asm/hypercall.h>
 #include <asm/page.h>
 #include <asm/uaccess.h>
 #include <asm/hvcall.h>
 
-/*
- * There is some serious guest hande effage heppening in this file so
- * this makes it a little easier to manage 
- */
 #define xen_guest_handle(hnd)  ((hnd).p)
-
 
 /* we need a xencomm descriptor to cover the dom0 op itself, plus one for every
  * pointer to another data structure. */
@@ -213,6 +209,48 @@ out:
        return ret;
 }
 
+static int xenppc_privcmd_version(privcmd_hypercall_t *hypercall)
+{
+       struct xencomm_desc *desc;
+       unsigned int argsize;
+       int ret;
+
+       switch (hypercall->arg[0]) {
+               case XENVER_version:
+                       /* no pointers used, so no xencomm stuff needed */
+                       return plpar_hcall_norets(XEN_MARK(hypercall->op), 
XENVER_version,
+                                       0, 0, 0, 0, 0);
+                       break;
+               case XENVER_extraversion:
+                       argsize = sizeof(xen_extraversion_t);
+                       break;
+               case XENVER_compile_info:
+                       argsize = sizeof(xen_compile_info_t);
+                       break;
+               case XENVER_capabilities:
+                       argsize = sizeof(xen_capabilities_info_t);
+                       break;
+               case XENVER_changeset:
+                       argsize = sizeof(xen_changeset_info_t);
+                       break;
+               case XENVER_platform_parameters:
+                       argsize = sizeof(xen_platform_parameters_t);
+                       break;
+               default:
+                       return -EINVAL;
+       }
+
+       ret = xencomm_create((void *)hypercall->arg[1], argsize, &desc, 
GFP_KERNEL);
+       if (ret)
+               return ret;
+
+       ret = plpar_hcall_norets(XEN_MARK(hypercall->op), hypercall->arg[0],
+                       __pa(desc), 0, 0, 0, 0);
+
+       xencomm_free(desc);
+       return ret;
+}
+
 /* The PowerPC hypervisor runs in a separate address space from Linux
  * kernel/userspace, i.e. real mode. We must therefore translate userspace
  * pointers to something the hypervisor can make sense of. */
@@ -223,6 +261,8 @@ int arch_privcmd_hypercall(privcmd_hyper
                        return xenppc_privcmd_dom0_op(hypercall);
                case __HYPERVISOR_memory_op:
                        return xenppc_privcmd_memory_op(hypercall);
+               case __HYPERVISOR_xen_version:
+                       return xenppc_privcmd_version(hypercall);
                default:
                        printk("%s: unknown hcall (%ld)\n", __func__, 
hypercall->op);
                        return plpar_hcall_norets(XEN_MARK(hypercall->op),
diff -r 11e1dcb7a976 -r de3e1e3bba22 drivers/xen/privcmd/privcmd.c
--- a/drivers/xen/privcmd/privcmd.c     Tue May 16 17:25:06 2006 -0500
+++ b/drivers/xen/privcmd/privcmd.c     Fri May 19 15:08:40 2006 -0500
@@ -37,6 +37,8 @@ static struct proc_dir_entry *capabiliti
 
 #define NR_HYPERCALLS 64
 static DECLARE_BITMAP(hypercall_permission_map, NR_HYPERCALLS);
+
+extern int arch_privcmd_hypercall(privcmd_hypercall_t *hypercall);
 
 static int privcmd_ioctl(struct inode *inode, struct file *file,
                          unsigned int cmd, unsigned long data)
diff -r 11e1dcb7a976 -r de3e1e3bba22 fs/compat_ioctl.c
--- a/fs/compat_ioctl.c Tue May 16 17:25:06 2006 -0500
+++ b/fs/compat_ioctl.c Fri May 19 15:08:40 2006 -0500
@@ -124,6 +124,8 @@
 #include <linux/dvb/frontend.h>
 #include <linux/dvb/video.h>
 #include <linux/lp.h>
+#include <xen/interface/xen.h>
+#include <xen/public/privcmd.h>
 
 /* Aiee. Someone does not find a difference between int and long */
 #define EXT2_IOC32_GETFLAGS               _IOR('f', 1, int)
@@ -2982,6 +2984,8 @@ COMPATIBLE_IOCTL(LPRESET)
 /*LPGETSTATS not implemented, but no kernels seem to compile it in anyways*/
 COMPATIBLE_IOCTL(LPGETFLAGS)
 HANDLE_IOCTL(LPSETTIMEOUT, lp_timeout_trans)
+
+COMPATIBLE_IOCTL(IOCTL_PRIVCMD_HYPERCALL)
 };
 
 int ioctl_table_size = ARRAY_SIZE(ioctl_start);



_______________________________________________
Xen-ppc-devel mailing list
Xen-ppc-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ppc-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.