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

[Xen-changelog] [xen-unstable] [IA64] Use common xencomm.c and remove ia64 xencomm.c



# HG changeset patch
# User Alex Williamson <alex.williamson@xxxxxx>
# Date 1187291021 21600
# Node ID cb3c7f00607790e06814550eb26708893f16a8bd
# Parent  778985f246a01b054378cb551069b6455fc1159a
[IA64] Use common xencomm.c and remove ia64 xencomm.c

Signed-off-by: Isaku Yamahata <yamahata@xxxxxxxxxxxxx>
---
 xen/arch/ia64/xen/xencomm.c         |  387 ------------------------------------
 config/ia64.mk                      |    1 
 xen/arch/ia64/xen/Makefile          |    1 
 xen/arch/ia64/xen/mm.c              |    4 
 xen/include/asm-ia64/guest_access.h |   88 --------
 xen/include/asm-ia64/mm.h           |    3 
 xen/include/public/arch-ia64.h      |    5 
 7 files changed, 10 insertions(+), 479 deletions(-)

diff -r 778985f246a0 -r cb3c7f006077 config/ia64.mk
--- a/config/ia64.mk    Thu Aug 16 10:47:33 2007 -0600
+++ b/config/ia64.mk    Thu Aug 16 13:03:41 2007 -0600
@@ -3,5 +3,6 @@ CONFIG_IA64_$(XEN_OS) := y
 
 CONFIG_IOEMU := y
 CONFIG_XCUTILS := y
+CONFIG_XENCOMM := y
 
 LIBDIR := lib
diff -r 778985f246a0 -r cb3c7f006077 xen/arch/ia64/xen/Makefile
--- a/xen/arch/ia64/xen/Makefile        Thu Aug 16 10:47:33 2007 -0600
+++ b/xen/arch/ia64/xen/Makefile        Thu Aug 16 13:03:41 2007 -0600
@@ -35,7 +35,6 @@ obj-y += flushd.o
 obj-y += flushd.o
 obj-y += privop_stat.o
 obj-y += xenpatch.o
-obj-y += xencomm.o
 
 obj-$(crash_debug) += gdbstub.o
 obj-$(xen_ia64_tlb_track) += tlb_track.o
diff -r 778985f246a0 -r cb3c7f006077 xen/arch/ia64/xen/mm.c
--- a/xen/arch/ia64/xen/mm.c    Thu Aug 16 10:47:33 2007 -0600
+++ b/xen/arch/ia64/xen/mm.c    Thu Aug 16 13:03:41 2007 -0600
@@ -744,7 +744,7 @@ void *domain_mpa_to_imva(struct domain *
 #endif
 
 unsigned long
-xencomm_paddr_to_maddr(unsigned long paddr)
+paddr_to_maddr(unsigned long paddr)
 {
     struct vcpu *v = current;
     struct domain *d = v->domain;
@@ -756,7 +756,7 @@ xencomm_paddr_to_maddr(unsigned long pad
                __func__, paddr, vcpu_regs(v)->cr_iip);
         return 0;
     }
-    return __va_ul((pa & _PFN_MASK) | (paddr & ~PAGE_MASK));
+    return (pa & _PFN_MASK) | (paddr & ~PAGE_MASK);
 }
 
 /* Allocate a new page for domain and map it to the specified metaphysical
diff -r 778985f246a0 -r cb3c7f006077 xen/arch/ia64/xen/xencomm.c
--- a/xen/arch/ia64/xen/xencomm.c       Thu Aug 16 10:47:33 2007 -0600
+++ /dev/null   Thu Jan 01 00:00:00 1970 +0000
@@ -1,387 +0,0 @@
-/*
- * 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, 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- *
- * Copyright (C) IBM Corp. 2006
- *
- * Authors: Hollis Blanchard <hollisb@xxxxxxxxxx>
- *          Tristan Gingold <tristan.gingold@xxxxxxxx>
- */
-
-#include <xen/config.h>
-#include <xen/mm.h>
-#include <xen/sched.h>
-#include <asm/current.h>
-#include <asm/guest_access.h>
-#include <public/xen.h>
-#include <public/xencomm.h>
-#include <xen/errno.h>
-
-#undef DEBUG
-#ifdef DEBUG
-static int xencomm_debug = 1; /* extremely verbose */
-#else
-#define xencomm_debug 0
-#endif
-
-static int
-xencomm_copy_chunk_from(
-    unsigned long to,
-    unsigned long paddr,
-    unsigned int  len)
-{
-    unsigned long maddr;
-    struct page_info *page;
-
-    while (1) {
-       maddr = xencomm_paddr_to_maddr(paddr);
-       if (xencomm_debug > 1)
-           printk("%lx[%d] -> %lx\n", maddr, len, to);
-       if (maddr == 0)
-           return -EFAULT;
-
-       page = virt_to_page(maddr);
-       if (get_page(page, current->domain) == 0) {
-           if (page_get_owner(page) != current->domain) {
-               /* This page might be a page granted by another domain  */
-               panic_domain(NULL, "copy_from_guest from foreign domain\n");
-           }
-           /* Try again.  */
-           continue;
-       }
-       memcpy((void *)to, (void *)maddr, len);
-       put_page(page);
-       return 0;
-    }
-}
-
-/**
- * xencomm_copy_from_guest: Copy a block of data from domain space.
- * @to:   Machine address.
- * @from: Physical address to a xencomm buffer descriptor.
- * @n:    Number of bytes to copy.
- * @skip: Number of bytes from the start to skip.
- *
- * Copy data from domain to hypervisor.
- *
- * Returns number of bytes that could not be copied.
- * On success, this will be zero.
- */
-unsigned long
-xencomm_copy_from_guest(
-    void         *to,
-    const void   *from,
-    unsigned int n,
-    unsigned int skip)
-{
-    struct xencomm_desc *desc;
-    unsigned long desc_addr;
-    unsigned int from_pos = 0;
-    unsigned int to_pos = 0;
-    unsigned int i = 0;
-
-    if (xencomm_debug)
-        printk("xencomm_copy_from_guest: from=%lx+%u n=%u\n",
-               (unsigned long)from, skip, n);
-
-    if (XENCOMM_IS_INLINE(from)) {
-        unsigned long src_paddr = XENCOMM_INLINE_ADDR(from);
-            
-        src_paddr += skip;
-
-        while (n > 0) {
-            unsigned int chunksz;
-            unsigned int bytes;
-           int res;
-            
-            chunksz = PAGE_SIZE - (src_paddr % PAGE_SIZE);
-            
-            bytes = min(chunksz, n);
-
-            res = xencomm_copy_chunk_from((unsigned long)to, src_paddr, bytes);
-           if (res != 0)
-               return -EFAULT;
-            src_paddr += bytes;
-            to += bytes;
-            n -= bytes;
-        }
-        
-        /* Always successful.  */
-        return 0;
-    }
-
-    /* first we need to access the descriptor */
-    desc_addr = xencomm_paddr_to_maddr((unsigned long)from);
-    if (desc_addr == 0)
-        return -EFAULT;
-
-    desc = (struct xencomm_desc *)desc_addr;
-    if (desc->magic != XENCOMM_MAGIC) {
-        printk("%s: error: %p magic was 0x%x\n",
-               __func__, desc, desc->magic);
-        return -EFAULT;
-    }
-
-    /* iterate through the descriptor, copying up to a page at a time */
-    while ((to_pos < n) && (i < desc->nr_addrs)) {
-        unsigned long src_paddr = desc->address[i];
-        unsigned int pgoffset;
-        unsigned int chunksz;
-        unsigned int chunk_skip;
-
-        if (src_paddr == XENCOMM_INVALID) {
-            i++;
-            continue;
-        }
-
-        pgoffset = src_paddr % PAGE_SIZE;
-        chunksz = PAGE_SIZE - pgoffset;
-
-        chunk_skip = min(chunksz, skip);
-        from_pos += chunk_skip;
-        chunksz -= chunk_skip;
-        skip -= chunk_skip;
-
-        if (skip == 0 && chunksz > 0) {
-            unsigned int bytes = min(chunksz, n - to_pos);
-           int res;
-
-            if (xencomm_debug > 1)
-                printk ("src_paddr=%lx i=%d, skip=%d\n",
-                        src_paddr, i, chunk_skip);
-
-            res = xencomm_copy_chunk_from((unsigned long)to + to_pos,
-                                          src_paddr + chunk_skip, bytes);
-            if (res != 0)
-                return -EFAULT;
-
-            from_pos += bytes;
-            to_pos += bytes;
-        }
-
-        i++;
-    }
-
-    return n - to_pos;
-}
-
-static int
-xencomm_copy_chunk_to(
-    unsigned long paddr,
-    unsigned long from,
-    unsigned int  len)
-{
-    unsigned long maddr;
-    struct page_info *page;
-
-    while (1) {
-       maddr = xencomm_paddr_to_maddr(paddr);
-       if (xencomm_debug > 1)
-           printk("%lx[%d] -> %lx\n", from, len, maddr);
-       if (maddr == 0)
-           return -EFAULT;
-
-       page = virt_to_page(maddr);
-       if (get_page(page, current->domain) == 0) {
-           if (page_get_owner(page) != current->domain) {
-               /* This page might be a page granted by another domain  */
-               panic_domain(NULL, "copy_to_guest to foreign domain\n");
-           }
-           /* Try again.  */
-           continue;
-       }
-       memcpy((void *)maddr, (void *)from, len);
-       put_page(page);
-       return 0;
-    }
-}
-
-/**
- * xencomm_copy_to_guest: Copy a block of data to domain space.
- * @to:     Physical address to xencomm buffer descriptor.
- * @from:   Machine address.
- * @n:      Number of bytes to copy.
- * @skip: Number of bytes from the start to skip.
- *
- * Copy data from hypervisor to domain.
- *
- * Returns number of bytes that could not be copied.
- * On success, this will be zero.
- */
-unsigned long
-xencomm_copy_to_guest(
-    void         *to,
-    const void   *from,
-    unsigned int n,
-    unsigned int skip)
-{
-    struct xencomm_desc *desc;
-    unsigned long desc_addr;
-    unsigned int from_pos = 0;
-    unsigned int to_pos = 0;
-    unsigned int i = 0;
-
-    if (xencomm_debug)
-        printk ("xencomm_copy_to_guest: to=%lx+%u n=%u\n",
-                (unsigned long)to, skip, n);
-
-    if (XENCOMM_IS_INLINE(to)) {
-        unsigned long dest_paddr = XENCOMM_INLINE_ADDR(to);
-            
-        dest_paddr += skip;
-
-        while (n > 0) {
-            unsigned int chunksz;
-            unsigned int bytes;
-            int res;
-
-            chunksz = PAGE_SIZE - (dest_paddr % PAGE_SIZE);
-            
-            bytes = min(chunksz, n);
-
-            res = xencomm_copy_chunk_to(dest_paddr, (unsigned long)from, 
bytes);
-            if (res != 0)
-                return res;
-
-            dest_paddr += bytes;
-            from += bytes;
-            n -= bytes;
-        }
-
-        /* Always successful.  */
-        return 0;
-    }
-
-    /* first we need to access the descriptor */
-    desc_addr = xencomm_paddr_to_maddr((unsigned long)to);
-    if (desc_addr == 0)
-        return -EFAULT;
-
-    desc = (struct xencomm_desc *)desc_addr;
-    if (desc->magic != XENCOMM_MAGIC) {
-        printk("%s error: %p magic was 0x%x\n", __func__, desc, desc->magic);
-        return -EFAULT;
-    }
-
-    /* iterate through the descriptor, copying up to a page at a time */
-    while ((from_pos < n) && (i < desc->nr_addrs)) {
-        unsigned long dest_paddr = desc->address[i];
-        unsigned int pgoffset;
-        unsigned int chunksz;
-        unsigned int chunk_skip;
-
-        if (dest_paddr == XENCOMM_INVALID) {
-            i++;
-            continue;
-        }
-
-        pgoffset = dest_paddr % PAGE_SIZE;
-        chunksz = PAGE_SIZE - pgoffset;
-
-        chunk_skip = min(chunksz, skip);
-        to_pos += chunk_skip;
-        chunksz -= chunk_skip;
-        skip -= chunk_skip;
-        dest_paddr += chunk_skip;
-
-        if (skip == 0 && chunksz > 0) {
-            unsigned int bytes = min(chunksz, n - from_pos);
-            int res;
-
-            res = xencomm_copy_chunk_to(dest_paddr,
-                                        (unsigned long)from + from_pos, bytes);
-            if (res != 0)
-                return res;
-
-            from_pos += bytes;
-            to_pos += bytes;
-        }
-
-        i++;
-    }
-    return n - from_pos;
-}
-
-/* Offset page addresses in 'handle' to skip 'bytes' bytes. Set completely
- * exhausted pages to XENCOMM_INVALID. */
-void *
-xencomm_add_offset(
-    void         *handle,
-    unsigned int bytes)
-{
-    struct xencomm_desc *desc;
-    unsigned long desc_addr;
-    int i = 0;
-
-    if (XENCOMM_IS_INLINE(handle))
-        return (void *)((unsigned long)handle + bytes);
-
-    /* first we need to access the descriptor */
-    desc_addr = xencomm_paddr_to_maddr((unsigned long)handle);
-    if (desc_addr == 0)
-        return NULL;
-
-    desc = (struct xencomm_desc *)desc_addr;
-    if (desc->magic != XENCOMM_MAGIC) {
-        printk("%s error: %p magic was 0x%x\n", __func__, desc, desc->magic);
-        return NULL;
-    }
-
-    /* iterate through the descriptor incrementing addresses */
-    while ((bytes > 0) && (i < desc->nr_addrs)) {
-        unsigned long dest_paddr = desc->address[i];
-        unsigned int pgoffset;
-        unsigned int chunksz;
-        unsigned int chunk_skip;
-
-        if (dest_paddr == XENCOMM_INVALID) {
-            i++;
-            continue;
-        }
-
-        pgoffset = dest_paddr % PAGE_SIZE;
-        chunksz = PAGE_SIZE - pgoffset;
-
-        chunk_skip = min(chunksz, bytes);
-        if (chunk_skip == chunksz) {
-            /* exhausted this page */
-            desc->address[i] = XENCOMM_INVALID;
-        } else {
-            desc->address[i] += chunk_skip;
-        }
-        bytes -= chunk_skip;
-       
-       i++;
-    }
-    return handle;
-}
-
-int
-xencomm_handle_is_null(
-   void *ptr)
-{
-    if (XENCOMM_IS_INLINE(ptr))
-        return XENCOMM_INLINE_ADDR(ptr) == 0;
-    else {
-        struct xencomm_desc *desc;
-        unsigned long desc_addr;
-
-        desc_addr = xencomm_paddr_to_maddr((unsigned long)ptr);
-        if (desc_addr == 0)
-            return 1;
-
-        desc = (struct xencomm_desc *)desc_addr;
-        return (desc->nr_addrs == 0);
-    }
-}
diff -r 778985f246a0 -r cb3c7f006077 xen/include/asm-ia64/guest_access.h
--- a/xen/include/asm-ia64/guest_access.h       Thu Aug 16 10:47:33 2007 -0600
+++ b/xen/include/asm-ia64/guest_access.h       Thu Aug 16 13:03:41 2007 -0600
@@ -22,89 +22,9 @@
 #ifndef __ASM_GUEST_ACCESS_H__
 #define __ASM_GUEST_ACCESS_H__
 
-extern unsigned long xencomm_copy_to_guest(void *to, const void *from,
-        unsigned int len, unsigned int skip); 
-extern unsigned long xencomm_copy_from_guest(void *to, const void *from,
-        unsigned int len, unsigned int skip); 
-extern void *xencomm_add_offset(void *handle, unsigned int bytes);
-extern int xencomm_handle_is_null(void *ptr);
-
-
-/* Is the guest handle a NULL reference? */
-#define guest_handle_is_null(hnd)                          \
-    ((hnd).p == NULL || xencomm_handle_is_null((hnd).p))
-
-/* Offset the given guest handle into the array it refers to. */
-#define guest_handle_add_offset(hnd, nr) ({                   \
-    const typeof((hnd).p) _ptr = (hnd).p;                     \
-    (hnd).p = xencomm_add_offset(_ptr, nr * sizeof(*_ptr));   \
-})
-
-/* Cast a guest handle to the specified type of handle. */
-#define guest_handle_cast(hnd, type) ({   \
-    type *_x = (hnd).p;                   \
-    XEN_GUEST_HANDLE(type) _y;            \
-    set_xen_guest_handle(_y, _x);         \
-    _y;                                   \
-})
-
-
-/* Since we run in real mode, we can safely access all addresses. That also
- * means our __routines are identical to our "normal" routines. */
-#define guest_handle_okay(hnd, nr) 1
-
-/*
- * Copy an array of objects to guest context via a guest handle.
- * Optionally specify an offset into the guest array.
- */
-#define copy_to_guest_offset(hnd, idx, ptr, nr) \
-    __copy_to_guest_offset(hnd, idx, ptr, nr)
-
-/* Copy sub-field of a structure to guest context via a guest handle. */
-#define copy_field_to_guest(hnd, ptr, field) \
-    __copy_field_to_guest(hnd, ptr, field)
-
-/*
- * Copy an array of objects from guest context via a guest handle.
- * Optionally specify an offset into the guest array.
- */
-#define copy_from_guest_offset(ptr, hnd, idx, nr) \
-    __copy_from_guest_offset(ptr, hnd, idx, nr)
-
-/* Copy sub-field of a structure from guest context via a guest handle. */
-#define copy_field_from_guest(ptr, hnd, field) \
-    __copy_field_from_guest(ptr, hnd, field)
-
-#define __copy_to_guest_offset(hnd, idx, ptr, nr) ({                    \
-    const typeof(*(ptr)) *_s = (ptr);                                   \
-    void *_d = (hnd).p;                                                 \
-    ((void)((hnd).p == (ptr)));                                         \
-    xencomm_copy_to_guest(_d, _s, sizeof(*_s)*(nr), sizeof(*_s)*(idx)); \
-})
-
-#define __copy_field_to_guest(hnd, ptr, field) ({                   \
-    unsigned int _off = offsetof(typeof(*(hnd).p), field);          \
-    const typeof(&(ptr)->field) _s = &(ptr)->field;                 \
-    void *_d = (hnd).p;                                             \
-    ((void)(&(hnd).p->field == &(ptr)->field));                     \
-    xencomm_copy_to_guest(_d, _s, sizeof(*_s), _off);               \
-})
-
-#define __copy_from_guest_offset(ptr, hnd, idx, nr) ({                    \
-    const typeof(*(ptr)) *_s = (hnd).p;                                   \
-    typeof(*(ptr)) *_d = (ptr);                                           \
-    xencomm_copy_from_guest(_d, _s, sizeof(*_d)*(nr), sizeof(*_d)*(idx)); \
-})
-
-#define __copy_field_from_guest(ptr, hnd, field) ({                 \
-    unsigned int _off = offsetof(typeof(*(hnd).p), field);          \
-    const void *_s = (hnd).p;                                       \
-    typeof(&(ptr)->field) _d = &(ptr)->field;                       \
-    ((void)(&(hnd).p->field == &(ptr)->field));                     \
-    xencomm_copy_from_guest(_d, _s, sizeof(*_d), _off);             \
-})
-
-/* Internal use only: returns 0 in case of bad address.  */
-extern unsigned long xencomm_paddr_to_maddr(unsigned long paddr);
+#include <xen/types.h> /* arch-ia64.h which is included by xen.h 
+                          requires uint64_t */
+#include <public/xen.h>        /* for XENCOMM_INLINE_FLAG */
+#include <xen/xencomm.h>
 
 #endif /* __ASM_GUEST_ACCESS_H__ */
diff -r 778985f246a0 -r cb3c7f006077 xen/include/asm-ia64/mm.h
--- a/xen/include/asm-ia64/mm.h Thu Aug 16 10:47:33 2007 -0600
+++ b/xen/include/asm-ia64/mm.h Thu Aug 16 13:03:41 2007 -0600
@@ -499,6 +499,9 @@ extern u64 translate_domain_pte(u64 ptev
     ((get_gpfn_from_mfn((madr) >> PAGE_SHIFT) << PAGE_SHIFT) | \
     ((madr) & ~PAGE_MASK))
 
+/* Internal use only: returns 0 in case of bad address.  */
+extern unsigned long paddr_to_maddr(unsigned long paddr);
+
 /* Arch-specific portion of memory_op hypercall. */
 long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg);
 
diff -r 778985f246a0 -r cb3c7f006077 xen/include/public/arch-ia64.h
--- a/xen/include/public/arch-ia64.h    Thu Aug 16 10:47:33 2007 -0600
+++ b/xen/include/public/arch-ia64.h    Thu Aug 16 13:03:41 2007 -0600
@@ -553,11 +553,6 @@ struct xen_ia64_boot_param {
 #define XENCOMM_INLINE_MASK 0xf800000000000000UL
 #define XENCOMM_INLINE_FLAG 0x8000000000000000UL
 
-#define XENCOMM_IS_INLINE(addr) \
-  (((unsigned long)(addr) & XENCOMM_INLINE_MASK) == XENCOMM_INLINE_FLAG)
-#define XENCOMM_INLINE_ADDR(addr) \
-  ((unsigned long)(addr) & ~XENCOMM_INLINE_MASK)
-
 #ifndef __ASSEMBLY__
 
 /*

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


 


Rackspace

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