From d870b4b7091a192b6513500f5679cdc6e4145041 Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Fri, 3 Mar 2006 18:26:41 +0100 Subject: [PATCH 1/6] Move dom0_op hypercall to the guest_handle interface (inside Xen). Signed-off-by: Keir Fraser --- xen/arch/ia64/xen/dom0_ops.c | 21 ++++----- xen/arch/x86/dom0_ops.c | 51 +++++++++++---------- xen/arch/x86/shadow32.c | 23 +++++----- xen/arch/x86/shadow_public.c | 21 +++++---- xen/common/dom0_ops.c | 44 +++++++++--------- xen/common/domain.c | 3 +- xen/common/perfc.c | 9 ++-- xen/drivers/char/console.c | 6 +-- xen/include/public/arch-ia64.h | 1 + xen/include/public/arch-x86_32.h | 1 + xen/include/public/arch-x86_64.h | 1 + xen/include/public/dom0_ops.h | 76 +++++++++++++++++++++++++------- xen/include/xen/console.h | 2 +- 13 files changed, 157 insertions(+), 102 deletions(-) diff --git a/xen/arch/ia64/xen/dom0_ops.c b/xen/arch/ia64/xen/dom0_ops.c index d35c61ec24..ea1b904cab 100644 --- a/xen/arch/ia64/xen/dom0_ops.c +++ b/xen/arch/ia64/xen/dom0_ops.c @@ -16,10 +16,11 @@ #include #include #include +#include #include #include -long arch_do_dom0_op(dom0_op_t *op, dom0_op_t *u_dom0_op) +long arch_do_dom0_op(dom0_op_t *op, guest_handle(dom0_op_t) u_dom0_op) { long ret = 0; @@ -64,7 +65,7 @@ long arch_do_dom0_op(dom0_op_t *op, dom0_op_t *u_dom0_op) put_domain(d); - copy_to_user(u_dom0_op, op, sizeof(*op)); + copy_to_guest(u_dom0_op, op, 1); } break; @@ -74,7 +75,6 @@ long arch_do_dom0_op(dom0_op_t *op, dom0_op_t *u_dom0_op) int n,j; int num = op->u.getpageframeinfo2.num; domid_t dom = op->u.getpageframeinfo2.domain; - unsigned long *s_ptr = (unsigned long*) op->u.getpageframeinfo2.array; struct domain *d; unsigned long *l_arr; ret = -ESRCH; @@ -95,7 +95,8 @@ long arch_do_dom0_op(dom0_op_t *op, dom0_op_t *u_dom0_op) { int k = ((num-n)>GPF2_BATCH)?GPF2_BATCH:(num-n); - if ( copy_from_user(l_arr, &s_ptr[n], k*sizeof(unsigned long)) ) + if ( copy_from_guest_offset(l_arr, op->u.getpageframeinfo2.array, + n, k) ) { ret = -EINVAL; break; @@ -135,7 +136,8 @@ long arch_do_dom0_op(dom0_op_t *op, dom0_op_t *u_dom0_op) } - if ( copy_to_user(&s_ptr[n], l_arr, k*sizeof(unsigned long)) ) + if ( copy_to_guest_offset(op->u.getpageframeinfo2.array, + n, l_arr, k) ) { ret = -EINVAL; break; @@ -160,7 +162,6 @@ long arch_do_dom0_op(dom0_op_t *op, dom0_op_t *u_dom0_op) unsigned long start_page = op->u.getmemlist.max_pfns >> 32; unsigned long nr_pages = op->u.getmemlist.max_pfns & 0xffffffff; unsigned long mfn; - unsigned long *buffer = op->u.getmemlist.buffer; ret = -EINVAL; if ( d != NULL ) @@ -180,16 +181,16 @@ long arch_do_dom0_op(dom0_op_t *op, dom0_op_t *u_dom0_op) { mfn = gmfn_to_mfn_foreign(d, i); - if ( put_user(mfn, buffer) ) + if ( copy_to_guest_offset(op->u.getmemlist.buffer, + i - start_page, &mfn, 1) ) { ret = -EFAULT; break; } - buffer++; } op->u.getmemlist.num_pfns = i - start_page; - copy_to_user(u_dom0_op, op, sizeof(*op)); + copy_to_guest(u_dom0_op, op, 1); put_domain(d); } @@ -211,7 +212,7 @@ long arch_do_dom0_op(dom0_op_t *op, dom0_op_t *u_dom0_op) memset(pi->hw_cap, 0, sizeof(pi->hw_cap)); //memcpy(pi->hw_cap, boot_cpu_data.x86_capability, NCAPINTS*4); ret = 0; - if ( copy_to_user(u_dom0_op, op, sizeof(*op)) ) + if ( copy_to_guest(u_dom0_op, op, 1) ) ret = -EFAULT; } break; diff --git a/xen/arch/x86/dom0_ops.c b/xen/arch/x86/dom0_ops.c index 3ca142ad69..bd35e49c55 100644 --- a/xen/arch/x86/dom0_ops.c +++ b/xen/arch/x86/dom0_ops.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -48,7 +49,7 @@ static void read_msr_for(void *unused) (void)rdmsr_safe(msr_addr, msr_lo, msr_hi); } -long arch_do_dom0_op(struct dom0_op *op, struct dom0_op *u_dom0_op) +long arch_do_dom0_op(struct dom0_op *op, guest_handle(dom0_op_t) u_dom0_op) { long ret = 0; @@ -75,7 +76,7 @@ long arch_do_dom0_op(struct dom0_op *op, struct dom0_op *u_dom0_op) op->u.msr.out1 = msr_lo; op->u.msr.out2 = msr_hi; - copy_to_user(u_dom0_op, op, sizeof(*op)); + copy_to_guest(u_dom0_op, op, 1); } ret = 0; } @@ -90,7 +91,7 @@ long arch_do_dom0_op(struct dom0_op *op, struct dom0_op *u_dom0_op) { ret = shadow_mode_control(d, &op->u.shadow_control); put_domain(d); - copy_to_user(u_dom0_op, op, sizeof(*op)); + copy_to_guest(u_dom0_op, op, 1); } } break; @@ -102,10 +103,11 @@ long arch_do_dom0_op(struct dom0_op *op, struct dom0_op *u_dom0_op) op->u.add_memtype.nr_mfns, op->u.add_memtype.type, 1); - if (ret > 0) + if ( ret > 0 ) { - (void)__put_user(0, &u_dom0_op->u.add_memtype.handle); - (void)__put_user(ret, &u_dom0_op->u.add_memtype.reg); + op->u.add_memtype.handle = 0; + op->u.add_memtype.reg = ret; + (void)copy_to_guest(u_dom0_op, op, 1); ret = 0; } } @@ -136,9 +138,10 @@ long arch_do_dom0_op(struct dom0_op *op, struct dom0_op *u_dom0_op) if ( op->u.read_memtype.reg < num_var_ranges ) { mtrr_if->get(op->u.read_memtype.reg, &mfn, &nr_mfns, &type); - (void)__put_user(mfn, &u_dom0_op->u.read_memtype.mfn); - (void)__put_user(nr_mfns, &u_dom0_op->u.read_memtype.nr_mfns); - (void)__put_user(type, &u_dom0_op->u.read_memtype.type); + op->u.read_memtype.mfn = mfn; + op->u.read_memtype.nr_mfns = nr_mfns; + op->u.read_memtype.type = type; + (void)copy_to_guest(u_dom0_op, op, 1); ret = 0; } } @@ -147,7 +150,7 @@ long arch_do_dom0_op(struct dom0_op *op, struct dom0_op *u_dom0_op) case DOM0_MICROCODE: { extern int microcode_update(void *buf, unsigned long len); - ret = microcode_update(op->u.microcode.data, op->u.microcode.length); + ret = microcode_update(op->u.microcode.data.p, op->u.microcode.length); } break; @@ -195,7 +198,7 @@ long arch_do_dom0_op(struct dom0_op *op, struct dom0_op *u_dom0_op) memset(pi->hw_cap, 0, sizeof(pi->hw_cap)); memcpy(pi->hw_cap, boot_cpu_data.x86_capability, NCAPINTS*4); ret = 0; - if ( copy_to_user(u_dom0_op, op, sizeof(*op)) ) + if ( copy_to_guest(u_dom0_op, op, 1) ) ret = -EFAULT; } break; @@ -245,7 +248,7 @@ long arch_do_dom0_op(struct dom0_op *op, struct dom0_op *u_dom0_op) put_domain(d); - copy_to_user(u_dom0_op, op, sizeof(*op)); + copy_to_guest(u_dom0_op, op, 1); } break; @@ -255,7 +258,6 @@ long arch_do_dom0_op(struct dom0_op *op, struct dom0_op *u_dom0_op) int n,j; int num = op->u.getpageframeinfo2.num; domid_t dom = op->u.getpageframeinfo2.domain; - unsigned long *s_ptr = (unsigned long*) op->u.getpageframeinfo2.array; struct domain *d; unsigned long *l_arr; ret = -ESRCH; @@ -277,7 +279,8 @@ long arch_do_dom0_op(struct dom0_op *op, struct dom0_op *u_dom0_op) { int k = ((num-n)>GPF2_BATCH)?GPF2_BATCH:(num-n); - if ( copy_from_user(l_arr, &s_ptr[n], k*sizeof(unsigned long)) ) + if ( copy_from_guest_offset(l_arr, op->u.getpageframeinfo2.array, + n, k) ) { ret = -EINVAL; break; @@ -320,7 +323,8 @@ long arch_do_dom0_op(struct dom0_op *op, struct dom0_op *u_dom0_op) } - if ( copy_to_user(&s_ptr[n], l_arr, k*sizeof(unsigned long)) ) + if ( copy_to_guest_offset(op->u.getpageframeinfo2.array, + n, l_arr, k) ) { ret = -EINVAL; break; @@ -341,7 +345,6 @@ long arch_do_dom0_op(struct dom0_op *op, struct dom0_op *u_dom0_op) struct domain *d = find_domain_by_id(op->u.getmemlist.domain); unsigned long max_pfns = op->u.getmemlist.max_pfns; unsigned long mfn; - unsigned long *buffer = op->u.getmemlist.buffer; struct list_head *list_ent; ret = -EINVAL; @@ -353,19 +356,20 @@ long arch_do_dom0_op(struct dom0_op *op, struct dom0_op *u_dom0_op) list_ent = d->page_list.next; for ( i = 0; (i < max_pfns) && (list_ent != &d->page_list); i++ ) { - mfn = page_to_mfn(list_entry(list_ent, struct page_info, list)); - if ( put_user(mfn, buffer) ) + mfn = page_to_mfn(list_entry( + list_ent, struct page_info, list)); + if ( copy_to_guest_offset(op->u.getmemlist.buffer, + i, &mfn, 1) ) { ret = -EFAULT; break; } - buffer++; list_ent = mfn_to_page(mfn)->list.next; } spin_unlock(&d->page_alloc_lock); op->u.getmemlist.num_pfns = i; - copy_to_user(u_dom0_op, op, sizeof(*op)); + copy_to_guest(u_dom0_op, op, 1); put_domain(d); } @@ -401,13 +405,12 @@ long arch_do_dom0_op(struct dom0_op *op, struct dom0_op *u_dom0_op) entry.start = e820.map[i].addr; entry.end = e820.map[i].addr + e820.map[i].size; entry.is_ram = (e820.map[i].type == E820_RAM); - (void)copy_to_user( - &op->u.physical_memory_map.memory_map[i], - &entry, sizeof(entry)); + (void)copy_to_guest_offset( + op->u.physical_memory_map.memory_map, i, &entry, 1); } op->u.physical_memory_map.nr_map_entries = i; - (void)copy_to_user(u_dom0_op, op, sizeof(*op)); + (void)copy_to_guest(u_dom0_op, op, 1); } break; diff --git a/xen/arch/x86/shadow32.c b/xen/arch/x86/shadow32.c index 372446de91..89cac6e263 100644 --- a/xen/arch/x86/shadow32.c +++ b/xen/arch/x86/shadow32.c @@ -29,6 +29,7 @@ #include #include #include +#include #define MFN_PINNED(_x) (mfn_to_page(_x)->u.inuse.type_info & PGT_pinned) #define va_to_l1mfn(_ed, _va) \ @@ -1508,14 +1509,14 @@ static int shadow_mode_table_op( d->arch.shadow_fault_count = 0; d->arch.shadow_dirty_count = 0; - if ( (sc->dirty_bitmap == NULL) || + if ( guest_handle_is_null(sc->dirty_bitmap) || (d->arch.shadow_dirty_bitmap == NULL) ) { rc = -EINVAL; break; } - if(sc->pages > d->arch.shadow_dirty_bitmap_size) + if ( sc->pages > d->arch.shadow_dirty_bitmap_size ) sc->pages = d->arch.shadow_dirty_bitmap_size; #define chunk (8*1024) /* Transfer and clear in 1kB chunks for L1 cache. */ @@ -1524,10 +1525,10 @@ static int shadow_mode_table_op( int bytes = ((((sc->pages - i) > chunk) ? chunk : (sc->pages - i)) + 7) / 8; - if (copy_to_user( - sc->dirty_bitmap + (i/(8*sizeof(unsigned long))), - d->arch.shadow_dirty_bitmap +(i/(8*sizeof(unsigned long))), - bytes)) + if ( copy_to_guest_offset( + sc->dirty_bitmap, i/(8*sizeof(unsigned long)), + d->arch.shadow_dirty_bitmap +(i/(8*sizeof(unsigned long))), + (bytes+sizeof(unsigned long)-1) / sizeof(unsigned long)) ) { rc = -EINVAL; break; @@ -1544,18 +1545,20 @@ static int shadow_mode_table_op( sc->stats.fault_count = d->arch.shadow_fault_count; sc->stats.dirty_count = d->arch.shadow_dirty_count; - if ( (sc->dirty_bitmap == NULL) || + if ( guest_handle_is_null(sc->dirty_bitmap) || (d->arch.shadow_dirty_bitmap == NULL) ) { rc = -EINVAL; break; } - if(sc->pages > d->arch.shadow_dirty_bitmap_size) + if ( sc->pages > d->arch.shadow_dirty_bitmap_size ) sc->pages = d->arch.shadow_dirty_bitmap_size; - if (copy_to_user(sc->dirty_bitmap, - d->arch.shadow_dirty_bitmap, (sc->pages+7)/8)) + if ( copy_to_guest(sc->dirty_bitmap, + d->arch.shadow_dirty_bitmap, + (((sc->pages+7)/8)+sizeof(unsigned long)-1) / + sizeof(unsigned long)) ) { rc = -EINVAL; break; diff --git a/xen/arch/x86/shadow_public.c b/xen/arch/x86/shadow_public.c index 63a507c631..58edcb552a 100644 --- a/xen/arch/x86/shadow_public.c +++ b/xen/arch/x86/shadow_public.c @@ -29,6 +29,7 @@ #include #include #include +#include #include static int alloc_p2m_table(struct domain *d); @@ -1267,14 +1268,14 @@ static int shadow_mode_table_op( d->arch.shadow_fault_count = 0; d->arch.shadow_dirty_count = 0; - if ( (sc->dirty_bitmap == NULL) || + if ( guest_handle_is_null(sc->dirty_bitmap) || (d->arch.shadow_dirty_bitmap == NULL) ) { rc = -EINVAL; break; } - if(sc->pages > d->arch.shadow_dirty_bitmap_size) + if ( sc->pages > d->arch.shadow_dirty_bitmap_size ) sc->pages = d->arch.shadow_dirty_bitmap_size; #define chunk (8*1024) /* Transfer and clear in 1kB chunks for L1 cache. */ @@ -1283,10 +1284,10 @@ static int shadow_mode_table_op( int bytes = ((((sc->pages - i) > chunk) ? chunk : (sc->pages - i)) + 7) / 8; - if (copy_to_user( - sc->dirty_bitmap + (i/(8*sizeof(unsigned long))), + if ( copy_to_guest_offset( + sc->dirty_bitmap, i/(8*sizeof(unsigned long)), d->arch.shadow_dirty_bitmap +(i/(8*sizeof(unsigned long))), - bytes)) + (bytes+sizeof(unsigned long)-1) / sizeof(unsigned long)) ) { rc = -EINVAL; break; @@ -1302,18 +1303,20 @@ static int shadow_mode_table_op( sc->stats.fault_count = d->arch.shadow_fault_count; sc->stats.dirty_count = d->arch.shadow_dirty_count; - if ( (sc->dirty_bitmap == NULL) || + if ( guest_handle_is_null(sc->dirty_bitmap) || (d->arch.shadow_dirty_bitmap == NULL) ) { rc = -EINVAL; break; } - if(sc->pages > d->arch.shadow_dirty_bitmap_size) + if ( sc->pages > d->arch.shadow_dirty_bitmap_size ) sc->pages = d->arch.shadow_dirty_bitmap_size; - if (copy_to_user(sc->dirty_bitmap, - d->arch.shadow_dirty_bitmap, (sc->pages+7)/8)) + if ( copy_to_guest(sc->dirty_bitmap, + d->arch.shadow_dirty_bitmap, + (((sc->pages+7)/8)+sizeof(unsigned long)-1) / + sizeof(unsigned long)) ) { rc = -EINVAL; break; diff --git a/xen/common/dom0_ops.c b/xen/common/dom0_ops.c index 7fc91e88e7..620171e888 100644 --- a/xen/common/dom0_ops.c +++ b/xen/common/dom0_ops.c @@ -17,13 +17,14 @@ #include #include #include +#include #include #include #include #include extern long arch_do_dom0_op( - struct dom0_op *op, struct dom0_op *u_dom0_op); + struct dom0_op *op, guest_handle(dom0_op_t) u_dom0_op); extern void arch_getdomaininfo_ctxt( struct vcpu *, struct vcpu_guest_context *); @@ -89,7 +90,7 @@ static void getdomaininfo(struct domain *d, dom0_getdomaininfo_t *info) memcpy(info->handle, d->handle, sizeof(xen_domain_handle_t)); } -long do_dom0_op(struct dom0_op *u_dom0_op) +long do_dom0_op(guest_handle(dom0_op_t) u_dom0_op) { long ret = 0; struct dom0_op curop, *op = &curop; @@ -99,7 +100,7 @@ long do_dom0_op(struct dom0_op *u_dom0_op) if ( !IS_PRIV(current->domain) ) return -EPERM; - if ( copy_from_user(op, u_dom0_op, sizeof(*op)) ) + if ( copy_from_guest(op, u_dom0_op, 1) ) return -EFAULT; if ( op->interface_version != DOM0_INTERFACE_VERSION ) @@ -239,7 +240,7 @@ long do_dom0_op(struct dom0_op *u_dom0_op) ret = 0; op->u.createdomain.domain = d->domain_id; - if ( copy_to_user(u_dom0_op, op, sizeof(*op)) ) + if ( copy_to_guest(u_dom0_op, op, 1) ) ret = -EFAULT; } break; @@ -357,7 +358,7 @@ long do_dom0_op(struct dom0_op *u_dom0_op) case DOM0_SCHEDCTL: { ret = sched_ctl(&op->u.schedctl); - if ( copy_to_user(u_dom0_op, op, sizeof(*op)) ) + if ( copy_to_guest(u_dom0_op, op, 1) ) ret = -EFAULT; } break; @@ -365,7 +366,7 @@ long do_dom0_op(struct dom0_op *u_dom0_op) case DOM0_ADJUSTDOM: { ret = sched_adjdom(&op->u.adjustdom); - if ( copy_to_user(u_dom0_op, op, sizeof(*op)) ) + if ( copy_to_guest(u_dom0_op, op, 1) ) ret = -EFAULT; } break; @@ -398,20 +399,17 @@ long do_dom0_op(struct dom0_op *u_dom0_op) getdomaininfo(d, &op->u.getdomaininfo); - if ( copy_to_user(u_dom0_op, op, sizeof(*op)) ) + if ( copy_to_guest(u_dom0_op, op, 1) ) ret = -EFAULT; put_domain(d); } break; - - case DOM0_GETDOMAININFOLIST: { struct domain *d; dom0_getdomaininfo_t info; - dom0_getdomaininfo_t *buffer = op->u.getdomaininfolist.buffer; u32 num_domains = 0; read_lock(&domlist_lock); @@ -432,13 +430,13 @@ long do_dom0_op(struct dom0_op *u_dom0_op) put_domain(d); - if ( copy_to_user(buffer, &info, sizeof(dom0_getdomaininfo_t)) ) + if ( copy_to_guest_offset(op->u.getdomaininfolist.buffer, + num_domains, &info, 1) ) { ret = -EFAULT; break; } - buffer++; num_domains++; } @@ -449,7 +447,7 @@ long do_dom0_op(struct dom0_op *u_dom0_op) op->u.getdomaininfolist.num_domains = num_domains; - if ( copy_to_user(u_dom0_op, op, sizeof(*op)) ) + if ( copy_to_guest(u_dom0_op, op, 1) ) ret = -EFAULT; } break; @@ -489,12 +487,12 @@ long do_dom0_op(struct dom0_op *u_dom0_op) if ( v != current ) vcpu_unpause(v); - if ( copy_to_user(op->u.getvcpucontext.ctxt, c, sizeof(*c)) ) + if ( copy_to_guest(op->u.getvcpucontext.ctxt, c, 1) ) ret = -EFAULT; xfree(c); - if ( copy_to_user(u_dom0_op, op, sizeof(*op)) ) + if ( copy_to_guest(u_dom0_op, op, 1) ) ret = -EFAULT; getvcpucontext_out: @@ -534,7 +532,7 @@ long do_dom0_op(struct dom0_op *u_dom0_op) (int)sizeof(op->u.getvcpuinfo.cpumap))); ret = 0; - if ( copy_to_user(u_dom0_op, op, sizeof(*op)) ) + if ( copy_to_guest(u_dom0_op, op, 1) ) ret = -EFAULT; getvcpuinfo_out: @@ -554,7 +552,7 @@ long do_dom0_op(struct dom0_op *u_dom0_op) case DOM0_TBUFCONTROL: { ret = tb_control(&op->u.tbufcontrol); - if ( copy_to_user(u_dom0_op, op, sizeof(*op)) ) + if ( copy_to_guest(u_dom0_op, op, 1) ) ret = -EFAULT; } break; @@ -562,10 +560,10 @@ long do_dom0_op(struct dom0_op *u_dom0_op) case DOM0_READCONSOLE: { ret = read_console_ring( - &op->u.readconsole.buffer, + op->u.readconsole.buffer, &op->u.readconsole.count, op->u.readconsole.clear); - if ( copy_to_user(u_dom0_op, op, sizeof(*op)) ) + if ( copy_to_guest(u_dom0_op, op, 1) ) ret = -EFAULT; } break; @@ -573,7 +571,7 @@ long do_dom0_op(struct dom0_op *u_dom0_op) case DOM0_SCHED_ID: { op->u.sched_id.sched_id = sched_id(); - if ( copy_to_user(u_dom0_op, op, sizeof(*op)) ) + if ( copy_to_guest(u_dom0_op, op, 1) ) ret = -EFAULT; else ret = 0; @@ -678,15 +676,15 @@ long do_dom0_op(struct dom0_op *u_dom0_op) { extern int perfc_control(dom0_perfccontrol_t *); ret = perfc_control(&op->u.perfccontrol); - if ( copy_to_user(u_dom0_op, op, sizeof(*op)) ) + if ( copy_to_guest(u_dom0_op, op, 1) ) ret = -EFAULT; } break; #endif default: - ret = arch_do_dom0_op(op,u_dom0_op); - + ret = arch_do_dom0_op(op, u_dom0_op); + break; } spin_unlock(&dom0_lock); diff --git a/xen/common/domain.c b/xen/common/domain.c index b80d8398e4..51def0d7f6 100644 --- a/xen/common/domain.c +++ b/xen/common/domain.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -380,7 +381,7 @@ int set_info_guest(struct domain *d, dom0_setvcpucontext_t *setvcpucontext) domain_pause(d); rc = -EFAULT; - if ( copy_from_user(c, setvcpucontext->ctxt, sizeof(*c)) == 0 ) + if ( copy_from_guest(c, setvcpucontext->ctxt, 1) == 0 ) rc = arch_set_info_guest(v, c); domain_unpause(d); diff --git a/xen/common/perfc.c b/xen/common/perfc.c index afb9af0bfa..782bb4f774 100644 --- a/xen/common/perfc.c +++ b/xen/common/perfc.c @@ -5,9 +5,10 @@ #include #include #include +#include +#include #include #include -#include #undef PERFCOUNTER #undef PERFCOUNTER_CPU @@ -131,12 +132,12 @@ void perfc_reset(unsigned char key) static dom0_perfc_desc_t perfc_d[NR_PERFCTRS]; static int perfc_init = 0; -static int perfc_copy_info(dom0_perfc_desc_t *desc) +static int perfc_copy_info(guest_handle(dom0_perfc_desc_t) desc) { unsigned int i, j; atomic_t *counters = (atomic_t *)&perfcounters; - if ( desc == NULL ) + if ( guest_handle_is_null(desc) ) return 0; /* We only copy the name and array-size information once. */ @@ -196,7 +197,7 @@ static int perfc_copy_info(dom0_perfc_desc_t *desc) } } - return (copy_to_user(desc, perfc_d, NR_PERFCTRS * sizeof(*desc)) ? + return (copy_to_guest(desc, (dom0_perfc_desc_t *)perfc_d, NR_PERFCTRS) ? -EFAULT : 0); } diff --git a/xen/drivers/char/console.c b/xen/drivers/char/console.c index 7c8b0d6baa..a882833107 100644 --- a/xen/drivers/char/console.c +++ b/xen/drivers/char/console.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -221,9 +222,8 @@ static void putchar_console_ring(int c) conringc = conringp - CONRING_SIZE; } -long read_console_ring(char **pstr, u32 *pcount, int clear) +long read_console_ring(guest_handle(char) str, u32 *pcount, int clear) { - char *str = *pstr; unsigned int idx, len, max, sofar, c; unsigned long flags; @@ -239,7 +239,7 @@ long read_console_ring(char **pstr, u32 *pcount, int clear) len = CONRING_SIZE - idx; if ( (sofar + len) > max ) len = max - sofar; - if ( copy_to_user(str + sofar, &conring[idx], len) ) + if ( copy_to_guest_offset(str, sofar, &conring[idx], len) ) return -EFAULT; sofar += len; c += len; diff --git a/xen/include/public/arch-ia64.h b/xen/include/public/arch-ia64.h index d2ac90d821..a288b997c7 100644 --- a/xen/include/public/arch-ia64.h +++ b/xen/include/public/arch-ia64.h @@ -298,6 +298,7 @@ typedef struct vcpu_guest_context { arch_initrd_info_t initrd; char cmdline[IA64_COMMAND_LINE_SIZE]; } vcpu_guest_context_t; +define_guest_handle(vcpu_guest_context_t); #endif /* !__ASSEMBLY__ */ diff --git a/xen/include/public/arch-x86_32.h b/xen/include/public/arch-x86_32.h index baa175a5a0..04e0168496 100644 --- a/xen/include/public/arch-x86_32.h +++ b/xen/include/public/arch-x86_32.h @@ -130,6 +130,7 @@ typedef struct vcpu_guest_context { unsigned long failsafe_callback_eip; unsigned long vm_assist; /* VMASST_TYPE_* bitmap */ } vcpu_guest_context_t; +define_guest_handle(vcpu_guest_context_t); typedef struct arch_shared_info { unsigned long max_pfn; /* max pfn that appears in table */ diff --git a/xen/include/public/arch-x86_64.h b/xen/include/public/arch-x86_64.h index d81a669cb4..024538532a 100644 --- a/xen/include/public/arch-x86_64.h +++ b/xen/include/public/arch-x86_64.h @@ -215,6 +215,7 @@ typedef struct vcpu_guest_context { uint64_t gs_base_kernel; uint64_t gs_base_user; } vcpu_guest_context_t; +define_guest_handle(vcpu_guest_context_t); typedef struct arch_shared_info { unsigned long max_pfn; /* max pfn that appears in table */ diff --git a/xen/include/public/dom0_ops.h b/xen/include/public/dom0_ops.h index 088bf29b51..7701c9b186 100644 --- a/xen/include/public/dom0_ops.h +++ b/xen/include/public/dom0_ops.h @@ -28,18 +28,21 @@ typedef struct dom0_getmemlist { /* IN variables. */ domid_t domain; unsigned long max_pfns; - void *buffer; + guest_handle(ulong) buffer; /* OUT variables. */ unsigned long num_pfns; } dom0_getmemlist_t; +define_guest_handle(dom0_getmemlist_t); #define DOM0_SCHEDCTL 6 /* struct sched_ctl_cmd is from sched-ctl.h */ typedef struct sched_ctl_cmd dom0_schedctl_t; +define_guest_handle(dom0_schedctl_t); #define DOM0_ADJUSTDOM 7 /* struct sched_adjdom_cmd is from sched-ctl.h */ typedef struct sched_adjdom_cmd dom0_adjustdom_t; +define_guest_handle(dom0_adjustdom_t); #define DOM0_CREATEDOMAIN 8 typedef struct dom0_createdomain { @@ -50,24 +53,28 @@ typedef struct dom0_createdomain { /* Identifier for new domain (auto-allocate if zero is specified). */ domid_t domain; } dom0_createdomain_t; +define_guest_handle(dom0_createdomain_t); #define DOM0_DESTROYDOMAIN 9 typedef struct dom0_destroydomain { /* IN variables. */ domid_t domain; } dom0_destroydomain_t; +define_guest_handle(dom0_destroydomain_t); #define DOM0_PAUSEDOMAIN 10 typedef struct dom0_pausedomain { /* IN parameters. */ domid_t domain; } dom0_pausedomain_t; +define_guest_handle(dom0_pausedomain_t); #define DOM0_UNPAUSEDOMAIN 11 typedef struct dom0_unpausedomain { /* IN parameters. */ domid_t domain; } dom0_unpausedomain_t; +define_guest_handle(dom0_unpausedomain_t); #define DOM0_GETDOMAININFO 12 typedef struct dom0_getdomaininfo { @@ -93,6 +100,7 @@ typedef struct dom0_getdomaininfo { uint32_t ssidref; xen_domain_handle_t handle; } dom0_getdomaininfo_t; +define_guest_handle(dom0_getdomaininfo_t); #define DOM0_SETVCPUCONTEXT 13 typedef struct dom0_setvcpucontext { @@ -100,8 +108,9 @@ typedef struct dom0_setvcpucontext { domid_t domain; uint32_t vcpu; /* IN/OUT parameters */ - vcpu_guest_context_t *ctxt; + guest_handle(vcpu_guest_context_t) ctxt; } dom0_setvcpucontext_t; +define_guest_handle(dom0_setvcpucontext_t); #define DOM0_MSR 15 typedef struct dom0_msr { @@ -115,6 +124,7 @@ typedef struct dom0_msr { uint32_t out1; uint32_t out2; } dom0_msr_t; +define_guest_handle(dom0_msr_t); /* * Set clock such that it would read after 00:00:00 UTC, @@ -127,6 +137,7 @@ typedef struct dom0_settime { uint32_t nsecs; uint64_t system_time; } dom0_settime_t; +define_guest_handle(dom0_settime_t); #define DOM0_GETPAGEFRAMEINFO 18 #define NOTAB 0 /* normal page */ @@ -147,6 +158,7 @@ typedef struct dom0_getpageframeinfo { /* Is the page PINNED to a type? */ uint32_t type; /* see above type defs */ } dom0_getpageframeinfo_t; +define_guest_handle(dom0_getpageframeinfo_t); /* * Read console content from Xen buffer ring. @@ -154,11 +166,12 @@ typedef struct dom0_getpageframeinfo { #define DOM0_READCONSOLE 19 typedef struct dom0_readconsole { /* IN variables. */ - uint32_t clear; /* Non-zero -> clear after reading. */ + uint32_t clear; /* Non-zero -> clear after reading. */ /* IN/OUT variables. */ - char *buffer; /* In: Buffer start; Out: Used buffer start */ - uint32_t count; /* In: Buffer size; Out: Used buffer size */ + guest_handle(char) buffer; /* In: Buffer start; Out: Used buffer start */ + uint32_t count; /* In: Buffer size; Out: Used buffer size */ } dom0_readconsole_t; +define_guest_handle(dom0_readconsole_t); /* * Set which physical cpus a vcpu can execute on. @@ -170,6 +183,7 @@ typedef struct dom0_setvcpuaffinity { uint32_t vcpu; cpumap_t cpumap; } dom0_setvcpuaffinity_t; +define_guest_handle(dom0_setvcpuaffinity_t); /* Get trace buffers machine base address */ #define DOM0_TBUFCONTROL 21 @@ -189,6 +203,7 @@ typedef struct dom0_tbufcontrol { unsigned long buffer_mfn; uint32_t size; } dom0_tbufcontrol_t; +define_guest_handle(dom0_tbufcontrol_t); /* * Get physical information about the host machine @@ -204,6 +219,7 @@ typedef struct dom0_physinfo { unsigned long free_pages; uint32_t hw_cap[8]; } dom0_physinfo_t; +define_guest_handle(dom0_physinfo_t); /* * Get the ID of the current scheduler. @@ -213,6 +229,7 @@ typedef struct dom0_sched_id { /* OUT variable */ uint32_t sched_id; } dom0_sched_id_t; +define_guest_handle(dom0_sched_id_t); /* * Control shadow pagetables operation @@ -234,17 +251,19 @@ typedef struct dom0_shadow_control_stats { uint32_t dirty_net_count; uint32_t dirty_block_count; } dom0_shadow_control_stats_t; +define_guest_handle(dom0_shadow_control_stats_t); typedef struct dom0_shadow_control { /* IN variables. */ domid_t domain; uint32_t op; - unsigned long *dirty_bitmap; /* pointer to locked buffer */ + guest_handle(ulong) dirty_bitmap; /* IN/OUT variables. */ unsigned long pages; /* size of buffer, updated with actual size */ /* OUT variables. */ dom0_shadow_control_stats_t stats; } dom0_shadow_control_t; +define_guest_handle(dom0_shadow_control_t); #define DOM0_SETDOMAINMAXMEM 28 typedef struct dom0_setdomainmaxmem { @@ -252,6 +271,7 @@ typedef struct dom0_setdomainmaxmem { domid_t domain; unsigned long max_memkb; } dom0_setdomainmaxmem_t; +define_guest_handle(dom0_setdomainmaxmem_t); #define DOM0_GETPAGEFRAMEINFO2 29 /* batched interface */ typedef struct dom0_getpageframeinfo2 { @@ -259,8 +279,9 @@ typedef struct dom0_getpageframeinfo2 { domid_t domain; unsigned long num; /* IN/OUT variables. */ - unsigned long *array; + guest_handle(ulong) array; } dom0_getpageframeinfo2_t; +define_guest_handle(dom0_getpageframeinfo2_t); /* * Request memory range (@mfn, @mfn+@nr_mfns-1) to have type @type. @@ -279,6 +300,7 @@ typedef struct dom0_add_memtype { uint32_t handle; uint32_t reg; } dom0_add_memtype_t; +define_guest_handle(dom0_add_memtype_t); /* * Tear down an existing memory-range type. If @handle is remembered then it @@ -293,6 +315,7 @@ typedef struct dom0_del_memtype { uint32_t handle; uint32_t reg; } dom0_del_memtype_t; +define_guest_handle(dom0_del_memtype_t); /* Read current type of an MTRR (x86-specific). */ #define DOM0_READ_MEMTYPE 33 @@ -304,6 +327,7 @@ typedef struct dom0_read_memtype { unsigned long nr_mfns; uint32_t type; } dom0_read_memtype_t; +define_guest_handle(dom0_read_memtype_t); /* Interface for controlling Xen software performance counters. */ #define DOM0_PERFCCONTROL 34 @@ -315,20 +339,23 @@ typedef struct dom0_perfc_desc { uint32_t nr_vals; /* number of values for this counter */ uint32_t vals[64]; /* array of values */ } dom0_perfc_desc_t; +define_guest_handle(dom0_perfc_desc_t); typedef struct dom0_perfccontrol { /* IN variables. */ uint32_t op; /* DOM0_PERFCCONTROL_OP_??? */ /* OUT variables. */ uint32_t nr_counters; /* number of counters */ - dom0_perfc_desc_t *desc; /* counter information (or NULL) */ + guest_handle(dom0_perfc_desc_t) desc; /* counter information (or NULL) */ } dom0_perfccontrol_t; +define_guest_handle(dom0_perfccontrol_t); #define DOM0_MICROCODE 35 typedef struct dom0_microcode { /* IN variables. */ - void *data; /* Pointer to microcode data */ + guest_handle(void) data; /* Pointer to microcode data */ uint32_t length; /* Length of microcode data. */ } dom0_microcode_t; +define_guest_handle(dom0_microcode_t); #define DOM0_IOPORT_PERMISSION 36 typedef struct dom0_ioport_permission { @@ -337,6 +364,7 @@ typedef struct dom0_ioport_permission { uint32_t nr_ports; /* size of port range */ uint8_t allow_access; /* allow or deny access to range? */ } dom0_ioport_permission_t; +define_guest_handle(dom0_ioport_permission_t); #define DOM0_GETVCPUCONTEXT 37 typedef struct dom0_getvcpucontext { @@ -344,8 +372,9 @@ typedef struct dom0_getvcpucontext { domid_t domain; /* domain to be affected */ uint32_t vcpu; /* vcpu # */ /* OUT variables. */ - vcpu_guest_context_t *ctxt; + guest_handle(vcpu_guest_context_t) ctxt; } dom0_getvcpucontext_t; +define_guest_handle(dom0_getvcpucontext_t); #define DOM0_GETVCPUINFO 43 typedef struct dom0_getvcpuinfo { @@ -360,16 +389,18 @@ typedef struct dom0_getvcpuinfo { uint32_t cpu; /* current mapping */ cpumap_t cpumap; /* allowable mapping */ } dom0_getvcpuinfo_t; +define_guest_handle(dom0_getvcpuinfo_t); #define DOM0_GETDOMAININFOLIST 38 typedef struct dom0_getdomaininfolist { /* IN variables. */ domid_t first_domain; uint32_t max_domains; - dom0_getdomaininfo_t *buffer; + guest_handle(dom0_getdomaininfo_t) buffer; /* OUT variables. */ uint32_t num_domains; } dom0_getdomaininfolist_t; +define_guest_handle(dom0_getdomaininfolist_t); #define DOM0_PLATFORM_QUIRK 39 #define QUIRK_NOIRQBALANCING 1 @@ -377,37 +408,44 @@ typedef struct dom0_platform_quirk { /* IN variables. */ uint32_t quirk_id; } dom0_platform_quirk_t; +define_guest_handle(dom0_platform_quirk_t); #define DOM0_PHYSICAL_MEMORY_MAP 40 +typedef struct dom0_memory_map_entry { + uint64_t start, end; + uint32_t flags; /* reserved */ + uint8_t is_ram; +} dom0_memory_map_entry_t; +define_guest_handle(dom0_memory_map_entry_t); typedef struct dom0_physical_memory_map { /* IN variables. */ uint32_t max_map_entries; /* OUT variables. */ uint32_t nr_map_entries; - struct dom0_memory_map_entry { - uint64_t start, end; - uint32_t flags; /* reserved */ - uint8_t is_ram; - } *memory_map; + guest_handle(dom0_memory_map_entry_t) memory_map; } dom0_physical_memory_map_t; +define_guest_handle(dom0_physical_memory_map_t); #define DOM0_MAX_VCPUS 41 typedef struct dom0_max_vcpus { domid_t domain; /* domain to be affected */ uint32_t max; /* maximum number of vcpus */ } dom0_max_vcpus_t; +define_guest_handle(dom0_max_vcpus_t); #define DOM0_SETDOMAINHANDLE 44 typedef struct dom0_setdomainhandle { domid_t domain; xen_domain_handle_t handle; } dom0_setdomainhandle_t; +define_guest_handle(dom0_setdomainhandle_t); #define DOM0_SETDEBUGGING 45 typedef struct dom0_setdebugging { domid_t domain; uint8_t enable; } dom0_setdebugging_t; +define_guest_handle(dom0_setdebugging_t); #define DOM0_IRQ_PERMISSION 46 typedef struct dom0_irq_permission { @@ -415,6 +453,7 @@ typedef struct dom0_irq_permission { uint8_t pirq; uint8_t allow_access; /* flag to specify enable/disable of IRQ access */ } dom0_irq_permission_t; +define_guest_handle(dom0_irq_permission_t); #define DOM0_IOMEM_PERMISSION 47 typedef struct dom0_iomem_permission { @@ -423,12 +462,14 @@ typedef struct dom0_iomem_permission { unsigned long nr_mfns; /* number of pages in range (>0) */ uint8_t allow_access; /* allow (!0) or deny (0) access to range? */ } dom0_iomem_permission_t; +define_guest_handle(dom0_iomem_permission_t); #define DOM0_HYPERCALL_INIT 48 typedef struct dom0_hypercall_init { domid_t domain; /* domain to be affected */ unsigned long mfn; /* machine frame to be initialised */ } dom0_hypercall_init_t; +define_guest_handle(dom0_hypercall_init_t); typedef struct dom0_op { uint32_t cmd; @@ -471,9 +512,10 @@ typedef struct dom0_op { struct dom0_irq_permission irq_permission; struct dom0_iomem_permission iomem_permission; struct dom0_hypercall_init hypercall_init; - uint8_t pad[128]; + uint8_t pad[128]; } u; } dom0_op_t; +define_guest_handle(dom0_op_t); #endif /* __XEN_PUBLIC_DOM0_OPS_H__ */ diff --git a/xen/include/xen/console.h b/xen/include/xen/console.h index 12028cdc97..e8cc3bfe67 100644 --- a/xen/include/xen/console.h +++ b/xen/include/xen/console.h @@ -13,7 +13,7 @@ extern spinlock_t console_lock; void set_printk_prefix(const char *prefix); -long read_console_ring(char **, u32 *, int); +long read_console_ring(guest_handle(char), u32 *, int); void init_console(void); void console_endboot(int disable_vga); From 74bb865dac0aaedaf2cc87db49de3e1595bee473 Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Fri, 3 Mar 2006 19:06:50 +0100 Subject: [PATCH 2/6] Avoid floating point in hash table implementation. Signed-off-by: Keir Fraser --- tools/xenstore/hashtable.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tools/xenstore/hashtable.c b/tools/xenstore/hashtable.c index 763357edce..c96fb675cd 100644 --- a/tools/xenstore/hashtable.c +++ b/tools/xenstore/hashtable.c @@ -6,6 +6,7 @@ #include #include #include +#include /* Credit for primes table: Aaron Krowne @@ -22,7 +23,7 @@ static const unsigned int primes[] = { 805306457, 1610612741 }; const unsigned int prime_table_length = sizeof(primes)/sizeof(primes[0]); -const float max_load_factor = 0.65; +const unsigned int max_load_factor = 65; /* percentage */ /*****************************************************************************/ struct hashtable * @@ -48,7 +49,7 @@ create_hashtable(unsigned int minsize, h->entrycount = 0; h->hashfn = hashf; h->eqfn = eqf; - h->loadlimit = (unsigned int) ceil(size * max_load_factor); + h->loadlimit = (unsigned int)(((uint64_t)size * max_load_factor) / 100); return h; } @@ -121,7 +122,8 @@ hashtable_expand(struct hashtable *h) } } h->tablelength = newsize; - h->loadlimit = (unsigned int) ceil(newsize * max_load_factor); + h->loadlimit = (unsigned int) + (((uint64_t)newsize * max_load_factor) / 100); return -1; } From 262bd587ceee8a192869e4b2e56a02d843da3276 Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Fri, 3 Mar 2006 19:07:55 +0100 Subject: [PATCH 3/6] /proc/xen/xsd_kva exports mmap interface that xenstored now uses to map the domain0 xenbus page. Signed-off-by: Keir Fraser --- .../drivers/xen/xenbus/xenbus_probe.c | 25 +++++++++++++++++-- tools/xenstore/xenstored_domain.c | 18 ++----------- 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c index cab6d5bec8..0448f18f0a 100644 --- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c +++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c @@ -951,9 +951,25 @@ void xenbus_probe(void *unused) } +static struct file_operations xsd_kva_fops; static struct proc_dir_entry *xsd_kva_intf; static struct proc_dir_entry *xsd_port_intf; +static int xsd_kva_mmap(struct file *file, struct vm_area_struct *vma) +{ + size_t size = vma->vm_end - vma->vm_start; + + if ((size > PAGE_SIZE) || (vma->vm_pgoff != 0)) + return -EINVAL; + + vma->vm_pgoff = mfn_to_pfn(xen_start_info->store_mfn); + + if (remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff, + size, vma->vm_page_prot)) + return -EAGAIN; + + return 0; +} static int xsd_kva_read(char *page, char **start, off_t off, int count, int *eof, void *data) @@ -1027,9 +1043,14 @@ static int __init xenbus_probe_init(void) xen_start_info->store_evtchn = op.u.alloc_unbound.port; /* And finally publish the above info in /proc/xen */ - if((xsd_kva_intf = create_xen_proc_entry("xsd_kva", 0400))) + if ((xsd_kva_intf = create_xen_proc_entry("xsd_kva", 0400))) { + memcpy(&xsd_kva_fops, xsd_kva_intf->proc_fops, + sizeof(xsd_kva_fops)); + xsd_kva_fops.mmap = xsd_kva_mmap; + xsd_kva_intf->proc_fops = &xsd_kva_fops; xsd_kva_intf->read_proc = xsd_kva_read; - if((xsd_port_intf = create_xen_proc_entry("xsd_port", 0400))) + } + if ((xsd_port_intf = create_xen_proc_entry("xsd_port", 0400))) xsd_port_intf->read_proc = xsd_port_read; } diff --git a/tools/xenstore/xenstored_domain.c b/tools/xenstore/xenstored_domain.c index 563f07e596..27f906dda6 100644 --- a/tools/xenstore/xenstored_domain.c +++ b/tools/xenstore/xenstored_domain.c @@ -27,7 +27,6 @@ #include #include #include -#include //#define DEBUG #include "utils.h" @@ -466,22 +465,9 @@ static int dom0_init(void) { int rc, fd; evtchn_port_t port; - unsigned long kva; char str[20]; struct domain *dom0; - fd = open(XENSTORED_PROC_KVA, O_RDONLY); - if (fd == -1) - return -1; - - rc = read(fd, str, sizeof(str)); - if (rc == -1) - goto outfd; - str[rc] = '\0'; - kva = strtoul(str, NULL, 0); - - close(fd); - fd = open(XENSTORED_PROC_PORT, O_RDONLY); if (fd == -1) return -1; @@ -496,12 +482,12 @@ static int dom0_init(void) dom0 = new_domain(NULL, 0, port); - fd = open(_PATH_KMEM, O_RDWR); + fd = open(XENSTORED_PROC_KVA, O_RDWR); if (fd == -1) return -1; dom0->interface = mmap(NULL, getpagesize(), PROT_READ|PROT_WRITE, - MAP_SHARED, fd, kva); + MAP_SHARED, fd, 0); if (dom0->interface == MAP_FAILED) goto outfd; From ac75acdd6045e766cc88f2584751ddd9cbf9ab77 Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Fri, 3 Mar 2006 19:21:48 +0100 Subject: [PATCH 4/6] Rename guest_handle() macro to GUEST_HANDLE() and define_guest_handle() to DEFINE_GUEST_HANDLE(). All caps for datatype declarations and definitions got the popular vote. :-) Signed-off-by: Keir Fraser --- xen/arch/ia64/xen/dom0_ops.c | 2 +- xen/arch/x86/dom0_ops.c | 2 +- xen/arch/x86/mm.c | 2 +- xen/arch/x86/x86_32/mm.c | 2 +- xen/arch/x86/x86_64/mm.c | 2 +- xen/common/dom0_ops.c | 4 +- xen/common/memory.c | 10 +-- xen/common/perfc.c | 2 +- xen/drivers/char/console.c | 2 +- xen/include/asm-x86/mm.h | 4 +- xen/include/public/arch-ia64.h | 2 +- xen/include/public/arch-x86_32.h | 2 +- xen/include/public/arch-x86_64.h | 2 +- xen/include/public/dom0_ops.h | 102 +++++++++++++++---------------- xen/include/public/memory.h | 16 ++--- xen/include/public/xen.h | 22 +++---- xen/include/xen/console.h | 2 +- xen/include/xen/guest_access.h | 2 +- xen/include/xen/sched.h | 2 +- 19 files changed, 92 insertions(+), 92 deletions(-) diff --git a/xen/arch/ia64/xen/dom0_ops.c b/xen/arch/ia64/xen/dom0_ops.c index ea1b904cab..857f0ab767 100644 --- a/xen/arch/ia64/xen/dom0_ops.c +++ b/xen/arch/ia64/xen/dom0_ops.c @@ -20,7 +20,7 @@ #include #include -long arch_do_dom0_op(dom0_op_t *op, guest_handle(dom0_op_t) u_dom0_op) +long arch_do_dom0_op(dom0_op_t *op, GUEST_HANDLE(dom0_op_t) u_dom0_op) { long ret = 0; diff --git a/xen/arch/x86/dom0_ops.c b/xen/arch/x86/dom0_ops.c index bd35e49c55..c0d8472c17 100644 --- a/xen/arch/x86/dom0_ops.c +++ b/xen/arch/x86/dom0_ops.c @@ -49,7 +49,7 @@ static void read_msr_for(void *unused) (void)rdmsr_safe(msr_addr, msr_lo, msr_hi); } -long arch_do_dom0_op(struct dom0_op *op, guest_handle(dom0_op_t) u_dom0_op) +long arch_do_dom0_op(struct dom0_op *op, GUEST_HANDLE(dom0_op_t) u_dom0_op) { long ret = 0; diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index 60e8e778b5..60a324cf79 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -2788,7 +2788,7 @@ long do_update_descriptor(u64 pa, u64 desc) } -long arch_memory_op(int op, guest_handle(void) arg) +long arch_memory_op(int op, GUEST_HANDLE(void) arg) { struct xen_reserved_phys_area xrpa; unsigned long pfn; diff --git a/xen/arch/x86/x86_32/mm.c b/xen/arch/x86/x86_32/mm.c index 2df32d9d8f..19dfc0170e 100644 --- a/xen/arch/x86/x86_32/mm.c +++ b/xen/arch/x86/x86_32/mm.c @@ -192,7 +192,7 @@ void subarch_init_memory(struct domain *dom_xen) } } -long subarch_memory_op(int op, guest_handle(void) arg) +long subarch_memory_op(int op, GUEST_HANDLE(void) arg) { struct xen_machphys_mfn_list xmml; unsigned long mfn; diff --git a/xen/arch/x86/x86_64/mm.c b/xen/arch/x86/x86_64/mm.c index 2a61d41324..7e826da8b0 100644 --- a/xen/arch/x86/x86_64/mm.c +++ b/xen/arch/x86/x86_64/mm.c @@ -183,7 +183,7 @@ void subarch_init_memory(struct domain *dom_xen) } } -long subarch_memory_op(int op, guest_handle(void) arg) +long subarch_memory_op(int op, GUEST_HANDLE(void) arg) { struct xen_machphys_mfn_list xmml; l3_pgentry_t l3e; diff --git a/xen/common/dom0_ops.c b/xen/common/dom0_ops.c index 620171e888..74b2d660f5 100644 --- a/xen/common/dom0_ops.c +++ b/xen/common/dom0_ops.c @@ -24,7 +24,7 @@ #include extern long arch_do_dom0_op( - struct dom0_op *op, guest_handle(dom0_op_t) u_dom0_op); + struct dom0_op *op, GUEST_HANDLE(dom0_op_t) u_dom0_op); extern void arch_getdomaininfo_ctxt( struct vcpu *, struct vcpu_guest_context *); @@ -90,7 +90,7 @@ static void getdomaininfo(struct domain *d, dom0_getdomaininfo_t *info) memcpy(info->handle, d->handle, sizeof(xen_domain_handle_t)); } -long do_dom0_op(guest_handle(dom0_op_t) u_dom0_op) +long do_dom0_op(GUEST_HANDLE(dom0_op_t) u_dom0_op) { long ret = 0; struct dom0_op curop, *op = &curop; diff --git a/xen/common/memory.c b/xen/common/memory.c index 3c0320ee39..eb0c68cac4 100644 --- a/xen/common/memory.c +++ b/xen/common/memory.c @@ -31,7 +31,7 @@ static long increase_reservation( struct domain *d, - guest_handle(ulong) extent_list, + GUEST_HANDLE(ulong) extent_list, unsigned int nr_extents, unsigned int extent_order, unsigned int flags, @@ -80,7 +80,7 @@ increase_reservation( static long populate_physmap( struct domain *d, - guest_handle(ulong) extent_list, + GUEST_HANDLE(ulong) extent_list, unsigned int nr_extents, unsigned int extent_order, unsigned int flags, @@ -141,7 +141,7 @@ populate_physmap( static long decrease_reservation( struct domain *d, - guest_handle(ulong) extent_list, + GUEST_HANDLE(ulong) extent_list, unsigned int nr_extents, unsigned int extent_order, unsigned int flags, @@ -198,7 +198,7 @@ decrease_reservation( static long translate_gpfn_list( - guest_handle(xen_translate_gpfn_list_t) uop, unsigned long *progress) + GUEST_HANDLE(xen_translate_gpfn_list_t) uop, unsigned long *progress) { struct xen_translate_gpfn_list op; unsigned long i, gpfn, mfn; @@ -257,7 +257,7 @@ translate_gpfn_list( return 0; } -long do_memory_op(unsigned long cmd, guest_handle(void) arg) +long do_memory_op(unsigned long cmd, GUEST_HANDLE(void) arg) { struct domain *d; int rc, op, flags = 0, preempted = 0; diff --git a/xen/common/perfc.c b/xen/common/perfc.c index 782bb4f774..0e3f6c5e54 100644 --- a/xen/common/perfc.c +++ b/xen/common/perfc.c @@ -132,7 +132,7 @@ void perfc_reset(unsigned char key) static dom0_perfc_desc_t perfc_d[NR_PERFCTRS]; static int perfc_init = 0; -static int perfc_copy_info(guest_handle(dom0_perfc_desc_t) desc) +static int perfc_copy_info(GUEST_HANDLE(dom0_perfc_desc_t) desc) { unsigned int i, j; atomic_t *counters = (atomic_t *)&perfcounters; diff --git a/xen/drivers/char/console.c b/xen/drivers/char/console.c index a882833107..bef57d1329 100644 --- a/xen/drivers/char/console.c +++ b/xen/drivers/char/console.c @@ -222,7 +222,7 @@ static void putchar_console_ring(int c) conringc = conringp - CONRING_SIZE; } -long read_console_ring(guest_handle(char) str, u32 *pcount, int clear) +long read_console_ring(GUEST_HANDLE(char) str, u32 *pcount, int clear) { unsigned int idx, len, max, sofar, c; unsigned long flags; diff --git a/xen/include/asm-x86/mm.h b/xen/include/asm-x86/mm.h index 1a65b04161..040d919626 100644 --- a/xen/include/asm-x86/mm.h +++ b/xen/include/asm-x86/mm.h @@ -380,7 +380,7 @@ void propagate_page_fault(unsigned long addr, u16 error_code); int __sync_lazy_execstate(void); /* Arch-specific portion of memory_op hypercall. */ -long arch_memory_op(int op, guest_handle(void) arg); -long subarch_memory_op(int op, guest_handle(void) arg); +long arch_memory_op(int op, GUEST_HANDLE(void) arg); +long subarch_memory_op(int op, GUEST_HANDLE(void) arg); #endif /* __ASM_X86_MM_H__ */ diff --git a/xen/include/public/arch-ia64.h b/xen/include/public/arch-ia64.h index a288b997c7..199b3acff6 100644 --- a/xen/include/public/arch-ia64.h +++ b/xen/include/public/arch-ia64.h @@ -298,7 +298,7 @@ typedef struct vcpu_guest_context { arch_initrd_info_t initrd; char cmdline[IA64_COMMAND_LINE_SIZE]; } vcpu_guest_context_t; -define_guest_handle(vcpu_guest_context_t); +DEFINE_GUEST_HANDLE(vcpu_guest_context_t); #endif /* !__ASSEMBLY__ */ diff --git a/xen/include/public/arch-x86_32.h b/xen/include/public/arch-x86_32.h index 04e0168496..9ae1494699 100644 --- a/xen/include/public/arch-x86_32.h +++ b/xen/include/public/arch-x86_32.h @@ -130,7 +130,7 @@ typedef struct vcpu_guest_context { unsigned long failsafe_callback_eip; unsigned long vm_assist; /* VMASST_TYPE_* bitmap */ } vcpu_guest_context_t; -define_guest_handle(vcpu_guest_context_t); +DEFINE_GUEST_HANDLE(vcpu_guest_context_t); typedef struct arch_shared_info { unsigned long max_pfn; /* max pfn that appears in table */ diff --git a/xen/include/public/arch-x86_64.h b/xen/include/public/arch-x86_64.h index 024538532a..bfd5f33d31 100644 --- a/xen/include/public/arch-x86_64.h +++ b/xen/include/public/arch-x86_64.h @@ -215,7 +215,7 @@ typedef struct vcpu_guest_context { uint64_t gs_base_kernel; uint64_t gs_base_user; } vcpu_guest_context_t; -define_guest_handle(vcpu_guest_context_t); +DEFINE_GUEST_HANDLE(vcpu_guest_context_t); typedef struct arch_shared_info { unsigned long max_pfn; /* max pfn that appears in table */ diff --git a/xen/include/public/dom0_ops.h b/xen/include/public/dom0_ops.h index 7701c9b186..0e546bc78d 100644 --- a/xen/include/public/dom0_ops.h +++ b/xen/include/public/dom0_ops.h @@ -28,21 +28,21 @@ typedef struct dom0_getmemlist { /* IN variables. */ domid_t domain; unsigned long max_pfns; - guest_handle(ulong) buffer; + GUEST_HANDLE(ulong) buffer; /* OUT variables. */ unsigned long num_pfns; } dom0_getmemlist_t; -define_guest_handle(dom0_getmemlist_t); +DEFINE_GUEST_HANDLE(dom0_getmemlist_t); #define DOM0_SCHEDCTL 6 /* struct sched_ctl_cmd is from sched-ctl.h */ typedef struct sched_ctl_cmd dom0_schedctl_t; -define_guest_handle(dom0_schedctl_t); +DEFINE_GUEST_HANDLE(dom0_schedctl_t); #define DOM0_ADJUSTDOM 7 /* struct sched_adjdom_cmd is from sched-ctl.h */ typedef struct sched_adjdom_cmd dom0_adjustdom_t; -define_guest_handle(dom0_adjustdom_t); +DEFINE_GUEST_HANDLE(dom0_adjustdom_t); #define DOM0_CREATEDOMAIN 8 typedef struct dom0_createdomain { @@ -53,28 +53,28 @@ typedef struct dom0_createdomain { /* Identifier for new domain (auto-allocate if zero is specified). */ domid_t domain; } dom0_createdomain_t; -define_guest_handle(dom0_createdomain_t); +DEFINE_GUEST_HANDLE(dom0_createdomain_t); #define DOM0_DESTROYDOMAIN 9 typedef struct dom0_destroydomain { /* IN variables. */ domid_t domain; } dom0_destroydomain_t; -define_guest_handle(dom0_destroydomain_t); +DEFINE_GUEST_HANDLE(dom0_destroydomain_t); #define DOM0_PAUSEDOMAIN 10 typedef struct dom0_pausedomain { /* IN parameters. */ domid_t domain; } dom0_pausedomain_t; -define_guest_handle(dom0_pausedomain_t); +DEFINE_GUEST_HANDLE(dom0_pausedomain_t); #define DOM0_UNPAUSEDOMAIN 11 typedef struct dom0_unpausedomain { /* IN parameters. */ domid_t domain; } dom0_unpausedomain_t; -define_guest_handle(dom0_unpausedomain_t); +DEFINE_GUEST_HANDLE(dom0_unpausedomain_t); #define DOM0_GETDOMAININFO 12 typedef struct dom0_getdomaininfo { @@ -100,7 +100,7 @@ typedef struct dom0_getdomaininfo { uint32_t ssidref; xen_domain_handle_t handle; } dom0_getdomaininfo_t; -define_guest_handle(dom0_getdomaininfo_t); +DEFINE_GUEST_HANDLE(dom0_getdomaininfo_t); #define DOM0_SETVCPUCONTEXT 13 typedef struct dom0_setvcpucontext { @@ -108,9 +108,9 @@ typedef struct dom0_setvcpucontext { domid_t domain; uint32_t vcpu; /* IN/OUT parameters */ - guest_handle(vcpu_guest_context_t) ctxt; + GUEST_HANDLE(vcpu_guest_context_t) ctxt; } dom0_setvcpucontext_t; -define_guest_handle(dom0_setvcpucontext_t); +DEFINE_GUEST_HANDLE(dom0_setvcpucontext_t); #define DOM0_MSR 15 typedef struct dom0_msr { @@ -124,7 +124,7 @@ typedef struct dom0_msr { uint32_t out1; uint32_t out2; } dom0_msr_t; -define_guest_handle(dom0_msr_t); +DEFINE_GUEST_HANDLE(dom0_msr_t); /* * Set clock such that it would read after 00:00:00 UTC, @@ -137,7 +137,7 @@ typedef struct dom0_settime { uint32_t nsecs; uint64_t system_time; } dom0_settime_t; -define_guest_handle(dom0_settime_t); +DEFINE_GUEST_HANDLE(dom0_settime_t); #define DOM0_GETPAGEFRAMEINFO 18 #define NOTAB 0 /* normal page */ @@ -158,7 +158,7 @@ typedef struct dom0_getpageframeinfo { /* Is the page PINNED to a type? */ uint32_t type; /* see above type defs */ } dom0_getpageframeinfo_t; -define_guest_handle(dom0_getpageframeinfo_t); +DEFINE_GUEST_HANDLE(dom0_getpageframeinfo_t); /* * Read console content from Xen buffer ring. @@ -168,10 +168,10 @@ typedef struct dom0_readconsole { /* IN variables. */ uint32_t clear; /* Non-zero -> clear after reading. */ /* IN/OUT variables. */ - guest_handle(char) buffer; /* In: Buffer start; Out: Used buffer start */ + GUEST_HANDLE(char) buffer; /* In: Buffer start; Out: Used buffer start */ uint32_t count; /* In: Buffer size; Out: Used buffer size */ } dom0_readconsole_t; -define_guest_handle(dom0_readconsole_t); +DEFINE_GUEST_HANDLE(dom0_readconsole_t); /* * Set which physical cpus a vcpu can execute on. @@ -183,7 +183,7 @@ typedef struct dom0_setvcpuaffinity { uint32_t vcpu; cpumap_t cpumap; } dom0_setvcpuaffinity_t; -define_guest_handle(dom0_setvcpuaffinity_t); +DEFINE_GUEST_HANDLE(dom0_setvcpuaffinity_t); /* Get trace buffers machine base address */ #define DOM0_TBUFCONTROL 21 @@ -203,7 +203,7 @@ typedef struct dom0_tbufcontrol { unsigned long buffer_mfn; uint32_t size; } dom0_tbufcontrol_t; -define_guest_handle(dom0_tbufcontrol_t); +DEFINE_GUEST_HANDLE(dom0_tbufcontrol_t); /* * Get physical information about the host machine @@ -219,7 +219,7 @@ typedef struct dom0_physinfo { unsigned long free_pages; uint32_t hw_cap[8]; } dom0_physinfo_t; -define_guest_handle(dom0_physinfo_t); +DEFINE_GUEST_HANDLE(dom0_physinfo_t); /* * Get the ID of the current scheduler. @@ -229,7 +229,7 @@ typedef struct dom0_sched_id { /* OUT variable */ uint32_t sched_id; } dom0_sched_id_t; -define_guest_handle(dom0_sched_id_t); +DEFINE_GUEST_HANDLE(dom0_sched_id_t); /* * Control shadow pagetables operation @@ -251,19 +251,19 @@ typedef struct dom0_shadow_control_stats { uint32_t dirty_net_count; uint32_t dirty_block_count; } dom0_shadow_control_stats_t; -define_guest_handle(dom0_shadow_control_stats_t); +DEFINE_GUEST_HANDLE(dom0_shadow_control_stats_t); typedef struct dom0_shadow_control { /* IN variables. */ domid_t domain; uint32_t op; - guest_handle(ulong) dirty_bitmap; + GUEST_HANDLE(ulong) dirty_bitmap; /* IN/OUT variables. */ unsigned long pages; /* size of buffer, updated with actual size */ /* OUT variables. */ dom0_shadow_control_stats_t stats; } dom0_shadow_control_t; -define_guest_handle(dom0_shadow_control_t); +DEFINE_GUEST_HANDLE(dom0_shadow_control_t); #define DOM0_SETDOMAINMAXMEM 28 typedef struct dom0_setdomainmaxmem { @@ -271,7 +271,7 @@ typedef struct dom0_setdomainmaxmem { domid_t domain; unsigned long max_memkb; } dom0_setdomainmaxmem_t; -define_guest_handle(dom0_setdomainmaxmem_t); +DEFINE_GUEST_HANDLE(dom0_setdomainmaxmem_t); #define DOM0_GETPAGEFRAMEINFO2 29 /* batched interface */ typedef struct dom0_getpageframeinfo2 { @@ -279,9 +279,9 @@ typedef struct dom0_getpageframeinfo2 { domid_t domain; unsigned long num; /* IN/OUT variables. */ - guest_handle(ulong) array; + GUEST_HANDLE(ulong) array; } dom0_getpageframeinfo2_t; -define_guest_handle(dom0_getpageframeinfo2_t); +DEFINE_GUEST_HANDLE(dom0_getpageframeinfo2_t); /* * Request memory range (@mfn, @mfn+@nr_mfns-1) to have type @type. @@ -300,7 +300,7 @@ typedef struct dom0_add_memtype { uint32_t handle; uint32_t reg; } dom0_add_memtype_t; -define_guest_handle(dom0_add_memtype_t); +DEFINE_GUEST_HANDLE(dom0_add_memtype_t); /* * Tear down an existing memory-range type. If @handle is remembered then it @@ -315,7 +315,7 @@ typedef struct dom0_del_memtype { uint32_t handle; uint32_t reg; } dom0_del_memtype_t; -define_guest_handle(dom0_del_memtype_t); +DEFINE_GUEST_HANDLE(dom0_del_memtype_t); /* Read current type of an MTRR (x86-specific). */ #define DOM0_READ_MEMTYPE 33 @@ -327,7 +327,7 @@ typedef struct dom0_read_memtype { unsigned long nr_mfns; uint32_t type; } dom0_read_memtype_t; -define_guest_handle(dom0_read_memtype_t); +DEFINE_GUEST_HANDLE(dom0_read_memtype_t); /* Interface for controlling Xen software performance counters. */ #define DOM0_PERFCCONTROL 34 @@ -339,23 +339,23 @@ typedef struct dom0_perfc_desc { uint32_t nr_vals; /* number of values for this counter */ uint32_t vals[64]; /* array of values */ } dom0_perfc_desc_t; -define_guest_handle(dom0_perfc_desc_t); +DEFINE_GUEST_HANDLE(dom0_perfc_desc_t); typedef struct dom0_perfccontrol { /* IN variables. */ uint32_t op; /* DOM0_PERFCCONTROL_OP_??? */ /* OUT variables. */ uint32_t nr_counters; /* number of counters */ - guest_handle(dom0_perfc_desc_t) desc; /* counter information (or NULL) */ + GUEST_HANDLE(dom0_perfc_desc_t) desc; /* counter information (or NULL) */ } dom0_perfccontrol_t; -define_guest_handle(dom0_perfccontrol_t); +DEFINE_GUEST_HANDLE(dom0_perfccontrol_t); #define DOM0_MICROCODE 35 typedef struct dom0_microcode { /* IN variables. */ - guest_handle(void) data; /* Pointer to microcode data */ + GUEST_HANDLE(void) data; /* Pointer to microcode data */ uint32_t length; /* Length of microcode data. */ } dom0_microcode_t; -define_guest_handle(dom0_microcode_t); +DEFINE_GUEST_HANDLE(dom0_microcode_t); #define DOM0_IOPORT_PERMISSION 36 typedef struct dom0_ioport_permission { @@ -364,7 +364,7 @@ typedef struct dom0_ioport_permission { uint32_t nr_ports; /* size of port range */ uint8_t allow_access; /* allow or deny access to range? */ } dom0_ioport_permission_t; -define_guest_handle(dom0_ioport_permission_t); +DEFINE_GUEST_HANDLE(dom0_ioport_permission_t); #define DOM0_GETVCPUCONTEXT 37 typedef struct dom0_getvcpucontext { @@ -372,9 +372,9 @@ typedef struct dom0_getvcpucontext { domid_t domain; /* domain to be affected */ uint32_t vcpu; /* vcpu # */ /* OUT variables. */ - guest_handle(vcpu_guest_context_t) ctxt; + GUEST_HANDLE(vcpu_guest_context_t) ctxt; } dom0_getvcpucontext_t; -define_guest_handle(dom0_getvcpucontext_t); +DEFINE_GUEST_HANDLE(dom0_getvcpucontext_t); #define DOM0_GETVCPUINFO 43 typedef struct dom0_getvcpuinfo { @@ -389,18 +389,18 @@ typedef struct dom0_getvcpuinfo { uint32_t cpu; /* current mapping */ cpumap_t cpumap; /* allowable mapping */ } dom0_getvcpuinfo_t; -define_guest_handle(dom0_getvcpuinfo_t); +DEFINE_GUEST_HANDLE(dom0_getvcpuinfo_t); #define DOM0_GETDOMAININFOLIST 38 typedef struct dom0_getdomaininfolist { /* IN variables. */ domid_t first_domain; uint32_t max_domains; - guest_handle(dom0_getdomaininfo_t) buffer; + GUEST_HANDLE(dom0_getdomaininfo_t) buffer; /* OUT variables. */ uint32_t num_domains; } dom0_getdomaininfolist_t; -define_guest_handle(dom0_getdomaininfolist_t); +DEFINE_GUEST_HANDLE(dom0_getdomaininfolist_t); #define DOM0_PLATFORM_QUIRK 39 #define QUIRK_NOIRQBALANCING 1 @@ -408,7 +408,7 @@ typedef struct dom0_platform_quirk { /* IN variables. */ uint32_t quirk_id; } dom0_platform_quirk_t; -define_guest_handle(dom0_platform_quirk_t); +DEFINE_GUEST_HANDLE(dom0_platform_quirk_t); #define DOM0_PHYSICAL_MEMORY_MAP 40 typedef struct dom0_memory_map_entry { @@ -416,36 +416,36 @@ typedef struct dom0_memory_map_entry { uint32_t flags; /* reserved */ uint8_t is_ram; } dom0_memory_map_entry_t; -define_guest_handle(dom0_memory_map_entry_t); +DEFINE_GUEST_HANDLE(dom0_memory_map_entry_t); typedef struct dom0_physical_memory_map { /* IN variables. */ uint32_t max_map_entries; /* OUT variables. */ uint32_t nr_map_entries; - guest_handle(dom0_memory_map_entry_t) memory_map; + GUEST_HANDLE(dom0_memory_map_entry_t) memory_map; } dom0_physical_memory_map_t; -define_guest_handle(dom0_physical_memory_map_t); +DEFINE_GUEST_HANDLE(dom0_physical_memory_map_t); #define DOM0_MAX_VCPUS 41 typedef struct dom0_max_vcpus { domid_t domain; /* domain to be affected */ uint32_t max; /* maximum number of vcpus */ } dom0_max_vcpus_t; -define_guest_handle(dom0_max_vcpus_t); +DEFINE_GUEST_HANDLE(dom0_max_vcpus_t); #define DOM0_SETDOMAINHANDLE 44 typedef struct dom0_setdomainhandle { domid_t domain; xen_domain_handle_t handle; } dom0_setdomainhandle_t; -define_guest_handle(dom0_setdomainhandle_t); +DEFINE_GUEST_HANDLE(dom0_setdomainhandle_t); #define DOM0_SETDEBUGGING 45 typedef struct dom0_setdebugging { domid_t domain; uint8_t enable; } dom0_setdebugging_t; -define_guest_handle(dom0_setdebugging_t); +DEFINE_GUEST_HANDLE(dom0_setdebugging_t); #define DOM0_IRQ_PERMISSION 46 typedef struct dom0_irq_permission { @@ -453,7 +453,7 @@ typedef struct dom0_irq_permission { uint8_t pirq; uint8_t allow_access; /* flag to specify enable/disable of IRQ access */ } dom0_irq_permission_t; -define_guest_handle(dom0_irq_permission_t); +DEFINE_GUEST_HANDLE(dom0_irq_permission_t); #define DOM0_IOMEM_PERMISSION 47 typedef struct dom0_iomem_permission { @@ -462,14 +462,14 @@ typedef struct dom0_iomem_permission { unsigned long nr_mfns; /* number of pages in range (>0) */ uint8_t allow_access; /* allow (!0) or deny (0) access to range? */ } dom0_iomem_permission_t; -define_guest_handle(dom0_iomem_permission_t); +DEFINE_GUEST_HANDLE(dom0_iomem_permission_t); #define DOM0_HYPERCALL_INIT 48 typedef struct dom0_hypercall_init { domid_t domain; /* domain to be affected */ unsigned long mfn; /* machine frame to be initialised */ } dom0_hypercall_init_t; -define_guest_handle(dom0_hypercall_init_t); +DEFINE_GUEST_HANDLE(dom0_hypercall_init_t); typedef struct dom0_op { uint32_t cmd; @@ -515,7 +515,7 @@ typedef struct dom0_op { uint8_t pad[128]; } u; } dom0_op_t; -define_guest_handle(dom0_op_t); +DEFINE_GUEST_HANDLE(dom0_op_t); #endif /* __XEN_PUBLIC_DOM0_OPS_H__ */ diff --git a/xen/include/public/memory.h b/xen/include/public/memory.h index e923731fbd..01d61df333 100644 --- a/xen/include/public/memory.h +++ b/xen/include/public/memory.h @@ -29,7 +29,7 @@ typedef struct xen_memory_reservation { * OUT: GMFN bases of extents that were allocated * (NB. This command also updates the mach_to_phys translation table) */ - guest_handle(ulong) extent_start; + GUEST_HANDLE(ulong) extent_start; /* Number of extents, and size/alignment of each (2^extent_order pages). */ unsigned long nr_extents; @@ -50,7 +50,7 @@ typedef struct xen_memory_reservation { domid_t domid; } xen_memory_reservation_t; -define_guest_handle(xen_memory_reservation_t); +DEFINE_GUEST_HANDLE(xen_memory_reservation_t); /* * Returns the maximum machine frame number of mapped RAM in this system. @@ -86,7 +86,7 @@ typedef struct xen_machphys_mfn_list { * any large discontiguities in the machine address space, 2MB gaps in * the machphys table will be represented by an MFN base of zero. */ - guest_handle(ulong) extent_start; + GUEST_HANDLE(ulong) extent_start; /* * Number of extents written to the above array. This will be smaller @@ -94,7 +94,7 @@ typedef struct xen_machphys_mfn_list { */ unsigned int nr_extents; } xen_machphys_mfn_list_t; -define_guest_handle(xen_machphys_mfn_list_t); +DEFINE_GUEST_HANDLE(xen_machphys_mfn_list_t); /* * Returns the base and size of the specified reserved 'RAM hole' in the @@ -115,7 +115,7 @@ typedef struct xen_reserved_phys_area { /* Base and size of the specified reserved area. */ unsigned long first_gpfn, nr_gpfns; } xen_reserved_phys_area_t; -define_guest_handle(xen_reserved_phys_area_t); +DEFINE_GUEST_HANDLE(xen_reserved_phys_area_t); /* * Translates a list of domain-specific GPFNs into MFNs. Returns a -ve error @@ -130,15 +130,15 @@ typedef struct xen_translate_gpfn_list { unsigned long nr_gpfns; /* List of GPFNs to translate. */ - guest_handle(ulong) gpfn_list; + GUEST_HANDLE(ulong) gpfn_list; /* * Output list to contain MFN translations. May be the same as the input * list (in which case each input GPFN is overwritten with the output MFN). */ - guest_handle(ulong) mfn_list; + GUEST_HANDLE(ulong) mfn_list; } xen_translate_gpfn_list_t; -define_guest_handle(xen_translate_gpfn_list_t); +DEFINE_GUEST_HANDLE(xen_translate_gpfn_list_t); #endif /* __XEN_PUBLIC_MEMORY_H__ */ diff --git a/xen/include/public/xen.h b/xen/include/public/xen.h index 907ac5cc6b..706e8000c1 100644 --- a/xen/include/public/xen.h +++ b/xen/include/public/xen.h @@ -10,25 +10,25 @@ #define __XEN_PUBLIC_XEN_H__ #ifdef __XEN__ -#define __define_guest_handle(name, type) \ +#define __DEFINE_GUEST_HANDLE(name, type) \ typedef struct { type *p; } __guest_handle_ ## name #else -#define __define_guest_handle(name, type) \ +#define __DEFINE_GUEST_HANDLE(name, type) \ typedef type * __guest_handle_ ## name #endif -#define define_guest_handle(name) __define_guest_handle(name, name) -#define guest_handle(name) __guest_handle_ ## name +#define DEFINE_GUEST_HANDLE(name) __DEFINE_GUEST_HANDLE(name, name) +#define GUEST_HANDLE(name) __guest_handle_ ## name #ifndef __ASSEMBLY__ /* Guest handles for primitive C types. */ -__define_guest_handle(uchar, unsigned char); -__define_guest_handle(uint, unsigned int); -__define_guest_handle(ulong, unsigned long); -define_guest_handle(char); -define_guest_handle(int); -define_guest_handle(long); -define_guest_handle(void); +__DEFINE_GUEST_HANDLE(uchar, unsigned char); +__DEFINE_GUEST_HANDLE(uint, unsigned int); +__DEFINE_GUEST_HANDLE(ulong, unsigned long); +DEFINE_GUEST_HANDLE(char); +DEFINE_GUEST_HANDLE(int); +DEFINE_GUEST_HANDLE(long); +DEFINE_GUEST_HANDLE(void); #endif #if defined(__i386__) diff --git a/xen/include/xen/console.h b/xen/include/xen/console.h index e8cc3bfe67..2c35e60fc1 100644 --- a/xen/include/xen/console.h +++ b/xen/include/xen/console.h @@ -13,7 +13,7 @@ extern spinlock_t console_lock; void set_printk_prefix(const char *prefix); -long read_console_ring(guest_handle(char), u32 *, int); +long read_console_ring(GUEST_HANDLE(char), u32 *, int); void init_console(void); void console_endboot(int disable_vga); diff --git a/xen/include/xen/guest_access.h b/xen/include/xen/guest_access.h index d824421bf0..3a5bba9f0b 100644 --- a/xen/include/xen/guest_access.h +++ b/xen/include/xen/guest_access.h @@ -18,7 +18,7 @@ /* Cast a guest handle to the specified type of handle. */ #define guest_handle_cast(hnd, type) ({ \ type *_x = (hnd).p; \ - (guest_handle(type)) { _x }; \ + (GUEST_HANDLE(type)) { _x }; \ }) /* diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h index 3acd0d79a0..2d9c5564d1 100644 --- a/xen/include/xen/sched.h +++ b/xen/include/xen/sched.h @@ -311,7 +311,7 @@ void startup_cpu_idle_loop(void); * 'i' [unsigned] {char, int} * 'l' [unsigned] long * 'p' pointer (foo *) - * 'h' guest handle (guest_handle(foo)) + * 'h' guest handle (GUEST_HANDLE(foo)) */ unsigned long hypercall_create_continuation( unsigned int op, const char *format, ...); From 0a4522458b80b1d21f4f749dd1512cc75df85769 Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Sat, 4 Mar 2006 10:25:05 +0100 Subject: [PATCH 5/6] Fix some warnings when compiling tools. Signed-off-by: Xin Li --- tools/firmware/vmxassist/setup.c | 5 +++-- tools/ioemu/audio/audio.c | 2 +- tools/ioemu/hw/i8254.c | 2 +- tools/ioemu/monitor.c | 8 ++++---- tools/ioemu/target-i386-dm/helper2.c | 16 +++++----------- tools/ioemu/vl.c | 4 ++-- xen/include/public/hvm/ioreq.h | 4 ++-- 7 files changed, 18 insertions(+), 23 deletions(-) diff --git a/tools/firmware/vmxassist/setup.c b/tools/firmware/vmxassist/setup.c index 25e5abd146..fcaf676e44 100644 --- a/tools/firmware/vmxassist/setup.c +++ b/tools/firmware/vmxassist/setup.c @@ -123,6 +123,8 @@ setup_paging(void) void setup_gdt(void) { + unsigned long long addr = (unsigned long long) &tss; + /* setup task state segment */ memset(&tss, 0, sizeof(tss)); tss.ss0 = DATA_SELECTOR; @@ -130,8 +132,7 @@ setup_gdt(void) tss.iomap_base = offsetof(struct tss, iomap); /* initialize gdt's tss selector */ - unsigned long long addr = (unsigned long long) &tss; - gdt[TSS_SELECTOR / sizeof(gdt[0])] |= + gdt[TSS_SELECTOR / sizeof(gdt[0])] |= ((addr & 0xFF000000) << (56-24)) | ((addr & 0x00FF0000) << (32-16)) | ((addr & 0x0000FFFF) << (16)) | diff --git a/tools/ioemu/audio/audio.c b/tools/ioemu/audio/audio.c index c3782d58a2..d866cde03b 100644 --- a/tools/ioemu/audio/audio.c +++ b/tools/ioemu/audio/audio.c @@ -713,7 +713,7 @@ int AUD_calc_elapsed (SWVoice *sw) delta = now - sw->old_ticks; bytes = (delta * sw->bytes_per_second) / ticks_per_sec; if (delta < 0) { - dolog ("whoops delta(<0)=%lld\n", delta); + dolog ("whoops delta(<0)=%"PRId64"\n", delta); return 0; } diff --git a/tools/ioemu/hw/i8254.c b/tools/ioemu/hw/i8254.c index 1d98bd72a5..7c5e622c4d 100644 --- a/tools/ioemu/hw/i8254.c +++ b/tools/ioemu/hw/i8254.c @@ -249,7 +249,7 @@ void pit_reset_hvm_vectors() req->u.data |= (irq << 16); req->u.data |= (hvm_channel << 24); req->u.data |= ((s->rw_mode) << 26); - fprintf(logfile, "HVM_PIT:pass info 0x%llx to HV!\n", req->u.data); + fprintf(logfile, "HVM_PIT:pass info 0x%"PRIx64" to HV!\n", req->u.data); } static inline void pit_load_count(PITChannelState *s, int val) diff --git a/tools/ioemu/monitor.c b/tools/ioemu/monitor.c index 3280dc0169..f4c06fbf14 100644 --- a/tools/ioemu/monitor.c +++ b/tools/ioemu/monitor.c @@ -676,19 +676,19 @@ static void monitor_handle_command(const char *cmdline) break; case '-': { - int has_option; + long has_option; /* option */ - + c = *typestr++; if (c == '\0') goto bad_type; - while (isspace(*p)) + while (isspace(*p)) p++; has_option = 0; if (*p == '-') { p++; if (*p != c) { - term_printf("%s: unsupported option -%c\n", + term_printf("%s: unsupported option -%c\n", cmdname, *p); goto fail; } diff --git a/tools/ioemu/target-i386-dm/helper2.c b/tools/ioemu/target-i386-dm/helper2.c index bc6bc0a12f..14341f3d18 100644 --- a/tools/ioemu/target-i386-dm/helper2.c +++ b/tools/ioemu/target-i386-dm/helper2.c @@ -138,11 +138,11 @@ void sp_info() req = &(shared_page->vcpu_iodata[i].vp_ioreq); term_printf("vcpu %d: event port %d\n", i, shared_page->vcpu_iodata[i].vp_eport); - term_printf(" req state: %x, pvalid: %x, addr: %llx, " - "data: %llx, count: %llx, size: %llx\n", + term_printf(" req state: %x, pvalid: %x, addr: %"PRIx64", " + "data: %"PRIx64", count: %"PRIx64", size: %"PRIx64"\n", req->state, req->pdata_valid, req->addr, req->u.data, req->count, req->size); - term_printf(" IO totally occurred on this vcpu: %llx\n", + term_printf(" IO totally occurred on this vcpu: %"PRIx64"\n", req->io_count); } } @@ -158,8 +158,8 @@ static ioreq_t* __cpu_get_ioreq(int vcpu) return req; fprintf(logfile, "False I/O request ... in-service already: " - "%x, pvalid: %x, port: %llx, " - "data: %llx, count: %llx, size: %llx\n", + "%x, pvalid: %x, port: %"PRIx64", " + "data: %"PRIx64", count: %"PRIx64", size: %"PRIx64"\n", req->state, req->pdata_valid, req->addr, req->u.data, req->count, req->size); return NULL; @@ -460,12 +460,6 @@ int main_loop(void) FD_ZERO(&wakeup_rfds); FD_SET(evtchn_fd, &wakeup_rfds); -#if __WORDSIZE == 32 -#define ULONGLONG_MAX 0xffffffffffffffffULL -#else -#define ULONGLONG_MAX ULONG_MAX -#endif - tun_receive_handler(&rfds); if ( FD_ISSET(evtchn_fd, &rfds) ) { cpu_handle_ioreq(env); diff --git a/tools/ioemu/vl.c b/tools/ioemu/vl.c index c8794f132d..d7d75dacb0 100644 --- a/tools/ioemu/vl.c +++ b/tools/ioemu/vl.c @@ -2672,6 +2672,7 @@ int main(int argc, char **argv) char qemu_dm_logfilename[64]; const char *loadvm = NULL; unsigned long nr_pages, extra_pages, ram_pages, *page_array; + xc_dominfo_t info; extern void *shared_page; extern void *shared_vram; @@ -3132,7 +3133,7 @@ int main(int argc, char **argv) ram_pages = ram_size/PAGE_SIZE; #if defined(__i386__) || defined(__x86_64__) - vgaram_pages = (vga_ram_size -1)/PAGE_SIZE + 1; + vgaram_pages = (vga_ram_size -1) / PAGE_SIZE + 1; free_pages = vgaram_pages / L1_PAGETABLE_ENTRIES; extra_pages = vgaram_pages + free_pages; #else @@ -3142,7 +3143,6 @@ int main(int argc, char **argv) xc_handle = xc_interface_open(); - xc_dominfo_t info; xc_domain_getinfo(xc_handle, domid, 1, &info); nr_pages = info.nr_pages + extra_pages; diff --git a/xen/include/public/hvm/ioreq.h b/xen/include/public/hvm/ioreq.h index c93f908dd6..4897ba3b14 100644 --- a/xen/include/public/hvm/ioreq.h +++ b/xen/include/public/hvm/ioreq.h @@ -71,8 +71,8 @@ typedef struct { typedef struct { ioreq_t vp_ioreq; /* Event channel port */ - unsigned long vp_eport; /* VMX vcpu uses this to notify DM */ - unsigned long dm_eport; /* DM uses this to notify VMX vcpu */ + unsigned int vp_eport; /* VMX vcpu uses this to notify DM */ + unsigned int dm_eport; /* DM uses this to notify VMX vcpu */ } vcpu_iodata_t; typedef struct { From 1407199f890908912670e40e03ec91e338601b30 Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Sat, 4 Mar 2006 10:32:10 +0100 Subject: [PATCH 6/6] Make guest_access implementation arch-specific. Signed-off-by: Keir Fraser --- xen/include/asm-ia64/guest_access.h | 63 +++++++++++++++++++++++++++++ xen/include/asm-x86/guest_access.h | 63 +++++++++++++++++++++++++++++ xen/include/public/arch-ia64.h | 22 ++++++++++ xen/include/public/arch-x86_32.h | 22 ++++++++++ xen/include/public/arch-x86_64.h | 22 ++++++++++ xen/include/public/xen.h | 22 ---------- xen/include/xen/guest_access.h | 49 +--------------------- 7 files changed, 193 insertions(+), 70 deletions(-) create mode 100644 xen/include/asm-ia64/guest_access.h create mode 100644 xen/include/asm-x86/guest_access.h diff --git a/xen/include/asm-ia64/guest_access.h b/xen/include/asm-ia64/guest_access.h new file mode 100644 index 0000000000..920476538e --- /dev/null +++ b/xen/include/asm-ia64/guest_access.h @@ -0,0 +1,63 @@ +/****************************************************************************** + * guest_access.h + * + * Copyright (c) 2006, K A Fraser + */ + +#ifndef __ASM_IA64_GUEST_ACCESS_H__ +#define __ASM_IA64_GUEST_ACCESS_H__ + +#include + +/* Is the guest handle a NULL reference? */ +#define guest_handle_is_null(hnd) ((hnd).p == NULL) + +/* Offset the given guest handle into the array it refers to. */ +#define guest_handle_add_offset(hnd, nr) ((hnd).p += (nr)) + +/* Cast a guest handle to the specified type of handle. */ +#define guest_handle_cast(hnd, type) ({ \ + type *_x = (hnd).p; \ + (GUEST_HANDLE(type)) { _x }; \ +}) + +/* + * Copy an array of objects to guest context via a guest handle, + * specifying an offset into the guest array. + */ +#define copy_to_guest_offset(hnd, off, ptr, nr) ({ \ + const typeof(ptr) _x = (hnd).p; \ + const typeof(ptr) _y = (ptr); \ + copy_to_user(_x+(off), _y, sizeof(*_x)*(nr)); \ +}) + +/* + * Copy an array of objects from guest context via a guest handle, + * specifying an offset into the guest array. + */ +#define copy_from_guest_offset(ptr, hnd, off, nr) ({ \ + const typeof(ptr) _x = (hnd).p; \ + const typeof(ptr) _y = (ptr); \ + copy_from_user(_y, _x+(off), sizeof(*_x)*(nr)); \ +}) + +/* + * Pre-validate a guest handle. + * Allows use of faster __copy_* functions. + */ +#define guest_handle_okay(hnd, nr) \ + array_access_ok((hnd).p, (nr), sizeof(*(hnd).p)) + +#define __copy_to_guest_offset(hnd, off, ptr, nr) ({ \ + const typeof(ptr) _x = (hnd).p; \ + const typeof(ptr) _y = (ptr); \ + __copy_to_user(_x+(off), _y, sizeof(*_x)*(nr)); \ +}) + +#define __copy_from_guest_offset(ptr, hnd, off, nr) ({ \ + const typeof(ptr) _x = (hnd).p; \ + const typeof(ptr) _y = (ptr); \ + __copy_from_user(_y, _x+(off), sizeof(*_x)*(nr)); \ +}) + +#endif /* __ASM_IA64_GUEST_ACCESS_H__ */ diff --git a/xen/include/asm-x86/guest_access.h b/xen/include/asm-x86/guest_access.h new file mode 100644 index 0000000000..4b75af5bee --- /dev/null +++ b/xen/include/asm-x86/guest_access.h @@ -0,0 +1,63 @@ +/****************************************************************************** + * guest_access.h + * + * Copyright (c) 2006, K A Fraser + */ + +#ifndef __ASM_X86_GUEST_ACCESS_H__ +#define __ASM_X86_GUEST_ACCESS_H__ + +#include + +/* Is the guest handle a NULL reference? */ +#define guest_handle_is_null(hnd) ((hnd).p == NULL) + +/* Offset the given guest handle into the array it refers to. */ +#define guest_handle_add_offset(hnd, nr) ((hnd).p += (nr)) + +/* Cast a guest handle to the specified type of handle. */ +#define guest_handle_cast(hnd, type) ({ \ + type *_x = (hnd).p; \ + (GUEST_HANDLE(type)) { _x }; \ +}) + +/* + * Copy an array of objects to guest context via a guest handle, + * specifying an offset into the guest array. + */ +#define copy_to_guest_offset(hnd, off, ptr, nr) ({ \ + const typeof(ptr) _x = (hnd).p; \ + const typeof(ptr) _y = (ptr); \ + copy_to_user(_x+(off), _y, sizeof(*_x)*(nr)); \ +}) + +/* + * Copy an array of objects from guest context via a guest handle, + * specifying an offset into the guest array. + */ +#define copy_from_guest_offset(ptr, hnd, off, nr) ({ \ + const typeof(ptr) _x = (hnd).p; \ + const typeof(ptr) _y = (ptr); \ + copy_from_user(_y, _x+(off), sizeof(*_x)*(nr)); \ +}) + +/* + * Pre-validate a guest handle. + * Allows use of faster __copy_* functions. + */ +#define guest_handle_okay(hnd, nr) \ + array_access_ok((hnd).p, (nr), sizeof(*(hnd).p)) + +#define __copy_to_guest_offset(hnd, off, ptr, nr) ({ \ + const typeof(ptr) _x = (hnd).p; \ + const typeof(ptr) _y = (ptr); \ + __copy_to_user(_x+(off), _y, sizeof(*_x)*(nr)); \ +}) + +#define __copy_from_guest_offset(ptr, hnd, off, nr) ({ \ + const typeof(ptr) _x = (hnd).p; \ + const typeof(ptr) _y = (ptr); \ + __copy_from_user(_y, _x+(off), sizeof(*_x)*(nr)); \ +}) + +#endif /* __ASM_X86_GUEST_ACCESS_H__ */ diff --git a/xen/include/public/arch-ia64.h b/xen/include/public/arch-ia64.h index 199b3acff6..1c7b286b47 100644 --- a/xen/include/public/arch-ia64.h +++ b/xen/include/public/arch-ia64.h @@ -7,6 +7,28 @@ #ifndef __HYPERVISOR_IF_IA64_H__ #define __HYPERVISOR_IF_IA64_H__ +#ifdef __XEN__ +#define __DEFINE_GUEST_HANDLE(name, type) \ + typedef struct { type *p; } __guest_handle_ ## name +#else +#define __DEFINE_GUEST_HANDLE(name, type) \ + typedef type * __guest_handle_ ## name +#endif + +#define DEFINE_GUEST_HANDLE(name) __DEFINE_GUEST_HANDLE(name, name) +#define GUEST_HANDLE(name) __guest_handle_ ## name + +#ifndef __ASSEMBLY__ +/* Guest handles for primitive C types. */ +__DEFINE_GUEST_HANDLE(uchar, unsigned char); +__DEFINE_GUEST_HANDLE(uint, unsigned int); +__DEFINE_GUEST_HANDLE(ulong, unsigned long); +DEFINE_GUEST_HANDLE(char); +DEFINE_GUEST_HANDLE(int); +DEFINE_GUEST_HANDLE(long); +DEFINE_GUEST_HANDLE(void); +#endif + /* Maximum number of virtual CPUs in multi-processor guests. */ /* WARNING: before changing this, check that shared_info fits on a page */ #define MAX_VIRT_CPUS 4 diff --git a/xen/include/public/arch-x86_32.h b/xen/include/public/arch-x86_32.h index 9ae1494699..17e40647a0 100644 --- a/xen/include/public/arch-x86_32.h +++ b/xen/include/public/arch-x86_32.h @@ -9,6 +9,28 @@ #ifndef __XEN_PUBLIC_ARCH_X86_32_H__ #define __XEN_PUBLIC_ARCH_X86_32_H__ +#ifdef __XEN__ +#define __DEFINE_GUEST_HANDLE(name, type) \ + typedef struct { type *p; } __guest_handle_ ## name +#else +#define __DEFINE_GUEST_HANDLE(name, type) \ + typedef type * __guest_handle_ ## name +#endif + +#define DEFINE_GUEST_HANDLE(name) __DEFINE_GUEST_HANDLE(name, name) +#define GUEST_HANDLE(name) __guest_handle_ ## name + +#ifndef __ASSEMBLY__ +/* Guest handles for primitive C types. */ +__DEFINE_GUEST_HANDLE(uchar, unsigned char); +__DEFINE_GUEST_HANDLE(uint, unsigned int); +__DEFINE_GUEST_HANDLE(ulong, unsigned long); +DEFINE_GUEST_HANDLE(char); +DEFINE_GUEST_HANDLE(int); +DEFINE_GUEST_HANDLE(long); +DEFINE_GUEST_HANDLE(void); +#endif + /* * SEGMENT DESCRIPTOR TABLES */ diff --git a/xen/include/public/arch-x86_64.h b/xen/include/public/arch-x86_64.h index bfd5f33d31..d907eea474 100644 --- a/xen/include/public/arch-x86_64.h +++ b/xen/include/public/arch-x86_64.h @@ -9,6 +9,28 @@ #ifndef __XEN_PUBLIC_ARCH_X86_64_H__ #define __XEN_PUBLIC_ARCH_X86_64_H__ +#ifdef __XEN__ +#define __DEFINE_GUEST_HANDLE(name, type) \ + typedef struct { type *p; } __guest_handle_ ## name +#else +#define __DEFINE_GUEST_HANDLE(name, type) \ + typedef type * __guest_handle_ ## name +#endif + +#define DEFINE_GUEST_HANDLE(name) __DEFINE_GUEST_HANDLE(name, name) +#define GUEST_HANDLE(name) __guest_handle_ ## name + +#ifndef __ASSEMBLY__ +/* Guest handles for primitive C types. */ +__DEFINE_GUEST_HANDLE(uchar, unsigned char); +__DEFINE_GUEST_HANDLE(uint, unsigned int); +__DEFINE_GUEST_HANDLE(ulong, unsigned long); +DEFINE_GUEST_HANDLE(char); +DEFINE_GUEST_HANDLE(int); +DEFINE_GUEST_HANDLE(long); +DEFINE_GUEST_HANDLE(void); +#endif + /* * SEGMENT DESCRIPTOR TABLES */ diff --git a/xen/include/public/xen.h b/xen/include/public/xen.h index 706e8000c1..9baf7f0bbe 100644 --- a/xen/include/public/xen.h +++ b/xen/include/public/xen.h @@ -9,28 +9,6 @@ #ifndef __XEN_PUBLIC_XEN_H__ #define __XEN_PUBLIC_XEN_H__ -#ifdef __XEN__ -#define __DEFINE_GUEST_HANDLE(name, type) \ - typedef struct { type *p; } __guest_handle_ ## name -#else -#define __DEFINE_GUEST_HANDLE(name, type) \ - typedef type * __guest_handle_ ## name -#endif - -#define DEFINE_GUEST_HANDLE(name) __DEFINE_GUEST_HANDLE(name, name) -#define GUEST_HANDLE(name) __guest_handle_ ## name - -#ifndef __ASSEMBLY__ -/* Guest handles for primitive C types. */ -__DEFINE_GUEST_HANDLE(uchar, unsigned char); -__DEFINE_GUEST_HANDLE(uint, unsigned int); -__DEFINE_GUEST_HANDLE(ulong, unsigned long); -DEFINE_GUEST_HANDLE(char); -DEFINE_GUEST_HANDLE(int); -DEFINE_GUEST_HANDLE(long); -DEFINE_GUEST_HANDLE(void); -#endif - #if defined(__i386__) #include "arch-x86_32.h" #elif defined(__x86_64__) diff --git a/xen/include/xen/guest_access.h b/xen/include/xen/guest_access.h index 3a5bba9f0b..0b9fb071a4 100644 --- a/xen/include/xen/guest_access.h +++ b/xen/include/xen/guest_access.h @@ -7,64 +7,17 @@ #ifndef __XEN_GUEST_ACCESS_H__ #define __XEN_GUEST_ACCESS_H__ -#include +#include -/* Is the guest handle a NULL reference? */ -#define guest_handle_is_null(hnd) ((hnd).p == NULL) - -/* Offset the given guest handle into the array it refers to. */ -#define guest_handle_add_offset(hnd, nr) ((hnd).p += (nr)) - -/* Cast a guest handle to the specified type of handle. */ -#define guest_handle_cast(hnd, type) ({ \ - type *_x = (hnd).p; \ - (GUEST_HANDLE(type)) { _x }; \ -}) - -/* - * 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, off, ptr, nr) ({ \ - const typeof(ptr) _x = (hnd).p; \ - const typeof(ptr) _y = (ptr); \ - copy_to_user(_x+(off), _y, sizeof(*_x)*(nr)); \ -}) #define copy_to_guest(hnd, ptr, nr) \ copy_to_guest_offset(hnd, 0, ptr, nr) -/* - * 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, off, nr) ({ \ - const typeof(ptr) _x = (hnd).p; \ - const typeof(ptr) _y = (ptr); \ - copy_from_user(_y, _x+(off), sizeof(*_x)*(nr)); \ -}) #define copy_from_guest(ptr, hnd, nr) \ copy_from_guest_offset(ptr, hnd, 0, nr) -/* - * Pre-validate a guest handle. - * Allows use of faster __copy_* functions. - */ -#define guest_handle_okay(hnd, nr) \ - array_access_ok((hnd).p, (nr), sizeof(*(hnd).p)) - -#define __copy_to_guest_offset(hnd, off, ptr, nr) ({ \ - const typeof(ptr) _x = (hnd).p; \ - const typeof(ptr) _y = (ptr); \ - __copy_to_user(_x+(off), _y, sizeof(*_x)*(nr)); \ -}) #define __copy_to_guest(hnd, ptr, nr) \ __copy_to_guest_offset(hnd, 0, ptr, nr) -#define __copy_from_guest_offset(ptr, hnd, off, nr) ({ \ - const typeof(ptr) _x = (hnd).p; \ - const typeof(ptr) _y = (ptr); \ - __copy_from_user(_y, _x+(off), sizeof(*_x)*(nr)); \ -}) #define __copy_from_guest(ptr, hnd, nr) \ __copy_from_guest_offset(ptr, hnd, 0, nr)