linux/include/xen/xencomm.h
<<
>>
Prefs
   1/*
   2 * This program is free software; you can redistribute it and/or modify
   3 * it under the terms of the GNU General Public License as published by
   4 * the Free Software Foundation; either version 2 of the License, or
   5 * (at your option) any later version.
   6 *
   7 * This program is distributed in the hope that it will be useful,
   8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
   9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  10 * GNU General Public License for more details.
  11 *
  12 * You should have received a copy of the GNU General Public License
  13 * along with this program; if not, write to the Free Software
  14 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  15 *
  16 * Copyright (C) IBM Corp. 2006
  17 *
  18 * Authors: Hollis Blanchard <hollisb@us.ibm.com>
  19 *          Jerone Young <jyoung5@us.ibm.com>
  20 */
  21
  22#ifndef _LINUX_XENCOMM_H_
  23#define _LINUX_XENCOMM_H_
  24
  25#include <xen/interface/xencomm.h>
  26
  27#define XENCOMM_MINI_ADDRS 3
  28struct xencomm_mini {
  29        struct xencomm_desc _desc;
  30        uint64_t address[XENCOMM_MINI_ADDRS];
  31};
  32
  33/* To avoid additionnal virt to phys conversion, an opaque structure is
  34   presented.  */
  35struct xencomm_handle;
  36
  37extern void xencomm_free(struct xencomm_handle *desc);
  38extern struct xencomm_handle *xencomm_map(void *ptr, unsigned long bytes);
  39extern struct xencomm_handle *__xencomm_map_no_alloc(void *ptr,
  40                        unsigned long bytes,  struct xencomm_mini *xc_area);
  41
  42#if 0
  43#define XENCOMM_MINI_ALIGNED(xc_desc, n)                                \
  44        struct xencomm_mini xc_desc ## _base[(n)]                       \
  45        __attribute__((__aligned__(sizeof(struct xencomm_mini))));      \
  46        struct xencomm_mini *xc_desc = &xc_desc ## _base[0];
  47#else
  48/*
  49 * gcc bug workaround:
  50 * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=16660
  51 * gcc doesn't handle properly stack variable with
  52 * __attribute__((__align__(sizeof(struct xencomm_mini))))
  53 */
  54#define XENCOMM_MINI_ALIGNED(xc_desc, n)                                \
  55        unsigned char xc_desc ## _base[((n) + 1 ) *                     \
  56                                       sizeof(struct xencomm_mini)];    \
  57        struct xencomm_mini *xc_desc = (struct xencomm_mini *)          \
  58                ((unsigned long)xc_desc ## _base +                      \
  59                 (sizeof(struct xencomm_mini) -                         \
  60                  ((unsigned long)xc_desc ## _base) %                   \
  61                  sizeof(struct xencomm_mini)));
  62#endif
  63#define xencomm_map_no_alloc(ptr, bytes)                        \
  64        ({ XENCOMM_MINI_ALIGNED(xc_desc, 1);                    \
  65                __xencomm_map_no_alloc(ptr, bytes, xc_desc); })
  66
  67/* provided by architecture code: */
  68extern unsigned long xencomm_vtop(unsigned long vaddr);
  69
  70static inline void *xencomm_pa(void *ptr)
  71{
  72        return (void *)xencomm_vtop((unsigned long)ptr);
  73}
  74
  75#define xen_guest_handle(hnd)  ((hnd).p)
  76
  77#endif /* _LINUX_XENCOMM_H_ */
  78