WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

Re: [Xen-devel] [PATCH 6 of 6] [XEN][LINUX] Add 32-bit privcmd ioctl con

To: Hollis Blanchard <hollisb@xxxxxxxxxx>
Subject: Re: [Xen-devel] [PATCH 6 of 6] [XEN][LINUX] Add 32-bit privcmd ioctl conversion for 64-bit kernels
From: Keir Fraser <keir@xxxxxxxxxxxxx>
Date: Thu, 05 Jul 2007 22:35:03 +0100
Cc: xen-devel@xxxxxxxxxxxxxxxxxxx, xen-ppc-devel@xxxxxxxxxxxxxxxxxxx
Delivery-date: Thu, 05 Jul 2007 14:29:58 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
In-reply-to: <7cae4be9db6be7b7d0c9.1183669725@localhost>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
Thread-index: Ace/TFi0l34TcCs/EdyIggAWy6hiGQ==
Thread-topic: [Xen-devel] [PATCH 6 of 6] [XEN][LINUX] Add 32-bit privcmd ioctl conversion for 64-bit kernels
User-agent: Microsoft-Entourage/11.3.3.061214
CONFIG_COMPAT stuff doesn't belong in include/xen/public/privcmd.h. That
header is shared with userspace so it should stay clean. Make a new one in
include/xen, or in drivers/xen/privcmd, whichever makes most sense.

 -- Keir

On 5/7/07 22:08, "Hollis Blanchard" <hollisb@xxxxxxxxxx> wrote:

> 5 files changed, 113 insertions(+), 2 deletions(-)
> drivers/xen/Makefile                 |    2
> drivers/xen/privcmd/Makefile         |    3 -
> drivers/xen/privcmd/compat_privcmd.c |   72 ++++++++++++++++++++++++++++++++++
> fs/compat_ioctl.c                    |   16 +++++++
> include/xen/public/privcmd.h         |   22 ++++++++++
> 
> 
> # HG changeset patch
> # User Hollis Blanchard <hollisb@xxxxxxxxxx>
> # Date 1183669279 18000
> # Node ID 7cae4be9db6be7b7d0c91dbb785ae14261c7116d
> # Parent  3ece3641ec01362c4333c74688a7f04ae4706ba4
> [XEN][LINUX] Add 32-bit privcmd ioctl conversion for 64-bit kernels.
> Signed-off-by: Hollis Blanchard <hollisb@xxxxxxxxxx>
> 
> diff -r 3ece3641ec01 -r 7cae4be9db6b drivers/xen/Makefile
> --- a/drivers/xen/Makefile Thu Jul 05 16:01:19 2007 -0500
> +++ b/drivers/xen/Makefile Thu Jul 05 16:01:19 2007 -0500
> @@ -1,7 +1,6 @@ obj-y += core/
>  obj-y += core/
>  obj-y += console/
>  obj-y += evtchn/
> -obj-y += privcmd/
>  obj-y += xenbus/
>  obj-y += gntdev/
>  obj-y += char/
> @@ -18,3 +17,4 @@ obj-$(CONFIG_XEN_PCIDEV_FRONTEND) += pci
>  obj-$(CONFIG_XEN_PCIDEV_FRONTEND) += pcifront/
>  obj-$(CONFIG_XEN_FRAMEBUFFER)  += fbfront/
>  obj-$(CONFIG_XEN_KEYBOARD)  += fbfront/
> +obj-$(CONFIG_XEN_PRIVCMD) += privcmd/
> diff -r 3ece3641ec01 -r 7cae4be9db6b drivers/xen/privcmd/Makefile
> --- a/drivers/xen/privcmd/Makefile Thu Jul 05 16:01:19 2007 -0500
> +++ b/drivers/xen/privcmd/Makefile Thu Jul 05 16:01:19 2007 -0500
> @@ -1,2 +1,3 @@
>  
> -obj-$(CONFIG_XEN_PRIVCMD) := privcmd.o
> +obj-y += privcmd.o
> +obj-$(CONFIG_COMPAT) += compat_privcmd.o
> diff -r 3ece3641ec01 -r 7cae4be9db6b drivers/xen/privcmd/compat_privcmd.c
> --- /dev/null Thu Jan 01 00:00:00 1970 +0000
> +++ b/drivers/xen/privcmd/compat_privcmd.c Thu Jul 05 16:01:19 2007 -0500
> @@ -0,0 +1,72 @@
> +/*
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
> + *
> + * Copyright (C) IBM Corp. 2006
> + *
> + * Authors: Jimi Xenidis <jimix@xxxxxxxxxxxxxx>
> + */
> +
> +#include <linux/config.h>
> +#include <linux/compat.h>
> +#include <linux/ioctl.h>
> +#include <linux/syscalls.h>
> +#include <asm/hypervisor.h>
> +#include <asm/uaccess.h>
> +#include <xen/public/privcmd.h>
> +
> +int privcmd_ioctl_32(int fd, unsigned int cmd, unsigned long arg)
> +{
> + int ret;
> +
> + switch (cmd) {
> + case IOCTL_PRIVCMD_MMAP_32: {
> +  struct privcmd_mmap *p;
> +  struct privcmd_mmap_32 *p32;
> +  struct privcmd_mmap_32 n32;
> +
> +  p32 = compat_ptr(arg);
> +  p = compat_alloc_user_space(sizeof(*p));
> +  if (copy_from_user(&n32, p32, sizeof(n32)) ||
> +      put_user(n32.num, &p->num) ||
> +      put_user(n32.dom, &p->dom) ||
> +      put_user(compat_ptr(n32.entry), &p->entry))
> +   return -EFAULT;
> +  
> +  ret = sys_ioctl(fd, IOCTL_PRIVCMD_MMAP, (unsigned long)p);
> + }
> +  break;
> + case IOCTL_PRIVCMD_MMAPBATCH_32: {
> +  struct privcmd_mmapbatch *p;
> +  struct privcmd_mmapbatch_32 *p32;
> +  struct privcmd_mmapbatch_32 n32;
> +
> +  p32 = compat_ptr(arg);
> +  p = compat_alloc_user_space(sizeof(*p));
> +  if (copy_from_user(&n32, p32, sizeof(n32)) ||
> +      put_user(n32.num, &p->num) ||
> +      put_user(n32.dom, &p->dom) ||
> +      put_user(n32.addr, &p->addr) ||
> +      put_user(compat_ptr(n32.arr), &p->arr))
> +   return -EFAULT;
> +  
> +  ret = sys_ioctl(fd, IOCTL_PRIVCMD_MMAPBATCH, (unsigned long)p);
> + }
> +  break;
> + default:
> +  ret = -EINVAL;
> +  break;
> + }
> + return ret;
> +}
> diff -r 3ece3641ec01 -r 7cae4be9db6b fs/compat_ioctl.c
> --- a/fs/compat_ioctl.c Thu Jul 05 16:01:19 2007 -0500
> +++ b/fs/compat_ioctl.c Thu Jul 05 16:01:19 2007 -0500
> @@ -123,6 +123,10 @@
>  #include <linux/dvb/frontend.h>
>  #include <linux/dvb/video.h>
>  #include <linux/lp.h>
> +
> +#include <xen/interface/xen.h>
> +#include <xen/public/evtchn.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)
> @@ -2948,6 +2952,18 @@ COMPATIBLE_IOCTL(LPRESET)
>  /*LPGETSTATS not implemented, but no kernels seem to compile it in anyways*/
>  COMPATIBLE_IOCTL(LPGETFLAGS)
>  HANDLE_IOCTL(LPSETTIMEOUT, lp_timeout_trans)
> +
> +#ifdef CONFIG_XEN
> +HANDLE_IOCTL(IOCTL_PRIVCMD_MMAP_32, privcmd_ioctl_32)
> +HANDLE_IOCTL(IOCTL_PRIVCMD_MMAPBATCH_32, privcmd_ioctl_32)
> +COMPATIBLE_IOCTL(IOCTL_PRIVCMD_HYPERCALL)
> +COMPATIBLE_IOCTL(IOCTL_EVTCHN_BIND_VIRQ)
> +COMPATIBLE_IOCTL(IOCTL_EVTCHN_BIND_INTERDOMAIN)
> +COMPATIBLE_IOCTL(IOCTL_EVTCHN_BIND_UNBOUND_PORT)
> +COMPATIBLE_IOCTL(IOCTL_EVTCHN_UNBIND)
> +COMPATIBLE_IOCTL(IOCTL_EVTCHN_NOTIFY)
> +COMPATIBLE_IOCTL(IOCTL_EVTCHN_RESET)
> +#endif
>  };
>  
>  int ioctl_table_size = ARRAY_SIZE(ioctl_start);
> diff -r 3ece3641ec01 -r 7cae4be9db6b include/xen/public/privcmd.h
> --- a/include/xen/public/privcmd.h Thu Jul 05 16:01:19 2007 -0500
> +++ b/include/xen/public/privcmd.h Thu Jul 05 16:01:19 2007 -0500
> @@ -34,6 +34,7 @@
>  #define __LINUX_PUBLIC_PRIVCMD_H__
>  
>  #include <linux/types.h>
> +#include <linux/compat.h>
>  
>  #ifndef __user
>  #define __user
> @@ -64,6 +65,27 @@ typedef struct privcmd_mmapbatch {
> xen_pfn_t __user *arr; /* array of mfns - top nibble set on err */
>  } privcmd_mmapbatch_t;
>  
> +#ifdef CONFIG_COMPAT
> +extern int privcmd_ioctl_32(int fd, unsigned int cmd, unsigned long arg);
> +struct privcmd_mmap_32 {
> + int num;
> + domid_t dom;
> + compat_uptr_t entry;
> +};
> +
> +struct privcmd_mmapbatch_32 {
> + int num;     /* number of pages to populate */
> + domid_t dom; /* target domain */
> + __u64 addr;  /* virtual address */
> + compat_uptr_t arr; /* array of mfns - top nibble set on err */
> +};
> +#define IOCTL_PRIVCMD_MMAP_32                   \
> + _IOC(_IOC_NONE, 'P', 2, sizeof(struct privcmd_mmap_32))
> +#define IOCTL_PRIVCMD_MMAPBATCH_32                  \
> + _IOC(_IOC_NONE, 'P', 3, sizeof(struct privcmd_mmapbatch_32))
> +
> +#endif
> +
>  /*
>   * @cmd: IOCTL_PRIVCMD_HYPERCALL
>   * @arg: &privcmd_hypercall_t
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-devel


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

<Prev in Thread] Current Thread [Next in Thread>