# HG changeset patch # User yamahata@xxxxxxxxxxxxx # Date 1186475123 -32400 # Node ID 8b6af0333d531d1fd63b1ce02c2df51b0d4f45f5 # Parent 6f18f5bdeea3473766929f9caa10cc163a411aa3 use common xencomm.c and remove ia64 xencomm.c PATCHNAME: use_common_xencomm_c_and_remove_ia64_xencomm_c Signed-off-by: Isaku Yamahata diff -r 6f18f5bdeea3 -r 8b6af0333d53 config/ia64.mk --- a/config/ia64.mk Mon Aug 06 15:33:42 2007 +0100 +++ b/config/ia64.mk Tue Aug 07 17:25:23 2007 +0900 @@ -3,5 +3,6 @@ CONFIG_IA64_$(XEN_OS) := y CONFIG_IOEMU := y CONFIG_XCUTILS := y +CONFIG_XENCOMM := y LIBDIR := lib diff -r 6f18f5bdeea3 -r 8b6af0333d53 xen/arch/ia64/xen/Makefile --- a/xen/arch/ia64/xen/Makefile Mon Aug 06 15:33:42 2007 +0100 +++ b/xen/arch/ia64/xen/Makefile Tue Aug 07 17:25:23 2007 +0900 @@ -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 6f18f5bdeea3 -r 8b6af0333d53 xen/arch/ia64/xen/mm.c --- a/xen/arch/ia64/xen/mm.c Mon Aug 06 15:33:42 2007 +0100 +++ b/xen/arch/ia64/xen/mm.c Tue Aug 07 17:25:23 2007 +0900 @@ -737,7 +737,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; diff -r 6f18f5bdeea3 -r 8b6af0333d53 xen/arch/ia64/xen/xencomm.c --- a/xen/arch/ia64/xen/xencomm.c Mon Aug 06 15:33:42 2007 +0100 +++ /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 - * Tristan Gingold - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#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 6f18f5bdeea3 -r 8b6af0333d53 xen/include/asm-ia64/guest_access.h --- a/xen/include/asm-ia64/guest_access.h Mon Aug 06 15:33:42 2007 +0100 +++ b/xen/include/asm-ia64/guest_access.h Tue Aug 07 17:25:23 2007 +0900 @@ -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 /* arch-ia64.h which is included by xen.h + requires uint64_t */ +#include /* for XENCOMM_INLINE_FLAG */ +#include #endif /* __ASM_GUEST_ACCESS_H__ */ diff -r 6f18f5bdeea3 -r 8b6af0333d53 xen/include/asm-ia64/mm.h --- a/xen/include/asm-ia64/mm.h Mon Aug 06 15:33:42 2007 +0100 +++ b/xen/include/asm-ia64/mm.h Tue Aug 07 17:25:23 2007 +0900 @@ -498,6 +498,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 6f18f5bdeea3 -r 8b6af0333d53 xen/include/public/arch-ia64.h --- a/xen/include/public/arch-ia64.h Mon Aug 06 15:33:42 2007 +0100 +++ b/xen/include/public/arch-ia64.h Tue Aug 07 17:25:23 2007 +0900 @@ -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__ /*