diff -r 85f92475b943 linux-2.6-xen-sparse/arch/xen/i386/kernel/microcode.c --- a/linux-2.6-xen-sparse/arch/xen/i386/kernel/microcode.c Mon Oct 3 18:14:02 2005 +++ b/linux-2.6-xen-sparse/arch/xen/i386/kernel/microcode.c Fri Oct 7 16:38:12 2005 @@ -68,7 +68,7 @@ return err; op.cmd = DOM0_MICROCODE; - op.u.microcode.data = user_buffer; + xenif_pack_ptr(op.u.microcode.data, user_buffer); op.u.microcode.length = user_buffer_size; err = HYPERVISOR_dom0_op(&op); diff -r 85f92475b943 linux-2.6-xen-sparse/arch/xen/i386/kernel/setup.c --- a/linux-2.6-xen-sparse/arch/xen/i386/kernel/setup.c Mon Oct 3 18:14:02 2005 +++ b/linux-2.6-xen-sparse/arch/xen/i386/kernel/setup.c Fri Oct 7 16:38:12 2005 @@ -1250,7 +1250,7 @@ #ifdef CONFIG_XEN map = alloc_bootmem_low_pages(PAGE_SIZE); op.cmd = DOM0_PHYSICAL_MEMORY_MAP; - op.u.physical_memory_map.memory_map = map; + xenif_pack_ptr(op.u.physical_memory_map.memory_map, map); op.u.physical_memory_map.max_map_entries = PAGE_SIZE / sizeof(struct dom0_memory_map_entry); BUG_ON(HYPERVISOR_dom0_op(&op)); diff -r 85f92475b943 tools/debugger/libxendebug/xendebug.c --- a/tools/debugger/libxendebug/xendebug.c Mon Oct 3 18:14:02 2005 +++ b/tools/debugger/libxendebug/xendebug.c Fri Oct 7 16:38:12 2005 @@ -142,7 +142,7 @@ op.cmd = DOM0_SETDOMAININFO; op.u.setdomaininfo.domain = ctxt->domid; op.u.setdomaininfo.vcpu = vcpu; - op.u.setdomaininfo.ctxt = &ctxt->context[vcpu]; + xenif_pack_ptr(op.u.setdomaininfo.ctxt, &ctxt->context[vcpu]); if ( (rc = mlock(&ctxt->context[vcpu], sizeof(vcpu_guest_context_t))) ) return rc; diff -r 85f92475b943 tools/libxc/xc_domain.c --- a/tools/libxc/xc_domain.c Mon Oct 3 18:14:02 2005 +++ b/tools/libxc/xc_domain.c Fri Oct 7 16:38:12 2005 @@ -65,7 +65,7 @@ op.cmd = DOM0_PINCPUDOMAIN; op.u.pincpudomain.domain = (domid_t)domid; op.u.pincpudomain.vcpu = vcpu; - op.u.pincpudomain.cpumap = cpumap; + xenif_pack_ptr(op.u.pincpudomain.cpumap, cpumap); return do_dom0_op(xc_handle, &op); } @@ -140,7 +140,7 @@ op.cmd = DOM0_GETDOMAININFOLIST; op.u.getdomaininfolist.first_domain = first_domain; op.u.getdomaininfolist.max_domains = max_domains; - op.u.getdomaininfolist.buffer = info; + xenif_pack_ptr(op.u.getdomaininfolist.buffer, info); if ( xc_dom0_op(xc_handle, &op) < 0 ) ret = -1; @@ -164,7 +164,7 @@ op.cmd = DOM0_GETVCPUCONTEXT; op.u.getvcpucontext.domain = (domid_t)domid; op.u.getvcpucontext.vcpu = (u16)vcpu; - op.u.getvcpucontext.ctxt = ctxt; + xenif_pack_ptr(op.u.getvcpucontext.ctxt, ctxt); if ( (ctxt != NULL) && ((rc = mlock(ctxt, sizeof(*ctxt))) != 0) ) @@ -194,7 +194,7 @@ op.cmd = DOM0_SHADOW_CONTROL; op.u.shadow_control.domain = (domid_t)domid; op.u.shadow_control.op = sop; - op.u.shadow_control.dirty_bitmap = dirty_bitmap; + xenif_pack_ptr(op.u.shadow_control.dirty_bitmap, dirty_bitmap); op.u.shadow_control.pages = pages; rc = do_dom0_op(xc_handle, &op); diff -r 85f92475b943 tools/libxc/xc_linux_build.c --- a/tools/libxc/xc_linux_build.c Mon Oct 3 18:14:02 2005 +++ b/tools/libxc/xc_linux_build.c Fri Oct 7 16:38:12 2005 @@ -847,7 +847,7 @@ launch_op.u.setdomaininfo.domain = (domid_t)domid; launch_op.u.setdomaininfo.vcpu = 0; - launch_op.u.setdomaininfo.ctxt = ctxt; + xenif_pack_ptr(launch_op.u.setdomaininfo.ctxt, ctxt); launch_op.cmd = DOM0_SETDOMAININFO; rc = xc_dom0_op(xc_handle, &launch_op); diff -r 85f92475b943 tools/libxc/xc_linux_restore.c --- a/tools/libxc/xc_linux_restore.c Mon Oct 3 18:14:02 2005 +++ b/tools/libxc/xc_linux_restore.c Fri Oct 7 16:38:12 2005 @@ -631,7 +631,7 @@ op.cmd = DOM0_SETDOMAININFO; op.u.setdomaininfo.domain = (domid_t)dom; op.u.setdomaininfo.vcpu = 0; - op.u.setdomaininfo.ctxt = &ctxt; + xenif_pack_ptr(op.u.setdomaininfo.ctxt, &ctxt); rc = xc_dom0_op(xc_handle, &op); if ( rc != 0 ) diff -r 85f92475b943 tools/libxc/xc_misc.c --- a/tools/libxc/xc_misc.c Mon Oct 3 18:14:02 2005 +++ b/tools/libxc/xc_misc.c Fri Oct 7 16:38:12 2005 @@ -30,7 +30,7 @@ unsigned int nr_chars = *pnr_chars; op.cmd = DOM0_READCONSOLE; - op.u.readconsole.buffer = buffer; + xenif_pack_ptr(op.u.readconsole.buffer, buffer); op.u.readconsole.count = nr_chars; op.u.readconsole.clear = clear; @@ -39,7 +39,7 @@ if ( (ret = do_dom0_op(xc_handle, &op)) == 0 ) { - *pbuffer = op.u.readconsole.buffer; + xenif_unpack_ptr(*pbuffer, op.u.readconsole.buffer); *pnr_chars = op.u.readconsole.count; } @@ -91,7 +91,7 @@ dop.cmd = DOM0_PERFCCONTROL; dop.u.perfccontrol.op = op; - dop.u.perfccontrol.desc = desc; + xenif_pack_ptr(dop.u.perfccontrol.desc, desc); rc = do_dom0_op(xc_handle, &dop); diff -r 85f92475b943 tools/libxc/xc_private.c --- a/tools/libxc/xc_private.c Mon Oct 3 18:14:02 2005 +++ b/tools/libxc/xc_private.c Fri Oct 7 16:38:12 2005 @@ -72,7 +72,7 @@ op.cmd = DOM0_GETPAGEFRAMEINFO2; op.u.getpageframeinfo2.domain = (domid_t)dom; op.u.getpageframeinfo2.num = num; - op.u.getpageframeinfo2.array = arr; + xenif_pack_ptr(op.u.getpageframeinfo2.array, arr); return do_dom0_op(xc_handle, &op); } @@ -259,7 +259,8 @@ op.cmd = DOM0_GETVCPUCONTEXT; op.u.getvcpucontext.domain = (domid_t)domid; op.u.getvcpucontext.vcpu = (u16)vcpu; - op.u.getvcpucontext.ctxt = NULL; + xenif_pack_ptr(op.u.getvcpucontext.ctxt, NULL); + if ( (do_dom0_op(xc_handle, &op) < 0) ) { PERROR("Could not get info on domain"); @@ -291,8 +292,8 @@ op.cmd = DOM0_GETMEMLIST; op.u.getmemlist.domain = (domid_t)domid; op.u.getmemlist.max_pfns = max_pfns; - op.u.getmemlist.buffer = pfn_buf; - + + xenif_pack_ptr(op.u.getmemlist.buffer, pfn_buf); if ( mlock(pfn_buf, max_pfns * sizeof(unsigned long)) != 0 ) { @@ -335,7 +336,7 @@ op.cmd = DOM0_GETMEMLIST; op.u.getmemlist.domain = (domid_t)domid; op.u.getmemlist.max_pfns = ((unsigned long)start_page << 32) | nr_pages; - op.u.getmemlist.buffer = pfn_buf; + xenif_pack_ptr(op.u.getmemlist.buffer, pfn_buf); if ( mlock(pfn_buf, nr_pages * sizeof(unsigned long)) != 0 ) { diff -r 85f92475b943 tools/libxc/xc_ptrace.c --- a/tools/libxc/xc_ptrace.c Mon Oct 3 18:14:02 2005 +++ b/tools/libxc/xc_ptrace.c Fri Oct 7 16:38:12 2005 @@ -385,7 +385,7 @@ op.u.setdomaininfo.domain = domid; /* XXX need to understand multiple vcpus */ op.u.setdomaininfo.vcpu = cpu; - op.u.setdomaininfo.ctxt = &ctxt[cpu]; + xenif_pack_ptr(op.u.setdomaininfo.ctxt, &ctxt[cpu]); retval = do_dom0_op(xc_handle, &op); if (retval) goto error_out; @@ -416,7 +416,7 @@ op.cmd = DOM0_SETDOMAININFO; op.u.setdomaininfo.domain = domid; op.u.setdomaininfo.vcpu = 0; - op.u.setdomaininfo.ctxt = &ctxt[cpu]; + xenif_pack_ptr(op.u.setdomaininfo.ctxt, &ctxt[cpu]); retval = do_dom0_op(xc_handle, &op); if ( retval ) { @@ -437,7 +437,7 @@ op.cmd = DOM0_SETDOMAININFO; op.u.setdomaininfo.domain = domid; op.u.setdomaininfo.vcpu = cpu; - op.u.setdomaininfo.ctxt = &ctxt[cpu]; + xenif_pack_ptr(op.u.setdomaininfo.ctxt, &ctxt[cpu]); retval = do_dom0_op(xc_handle, &op); if ( retval ) { diff -r 85f92475b943 tools/libxc/xc_vmx_build.c --- a/tools/libxc/xc_vmx_build.c Mon Oct 3 18:14:02 2005 +++ b/tools/libxc/xc_vmx_build.c Fri Oct 7 16:38:12 2005 @@ -700,7 +700,7 @@ launch_op.u.setdomaininfo.domain = (domid_t)domid; launch_op.u.setdomaininfo.vcpu = 0; - launch_op.u.setdomaininfo.ctxt = ctxt; + xenif_pack_ptr(launch_op.u.setdomaininfo.ctxt, ctxt); launch_op.cmd = DOM0_SETDOMAININFO; rc = xc_dom0_op(xc_handle, &launch_op); diff -r 85f92475b943 tools/xenstat/libxenstat/src/xen-interface.c --- a/tools/xenstat/libxenstat/src/xen-interface.c Mon Oct 3 18:14:02 2005 +++ b/tools/xenstat/libxenstat/src/xen-interface.c Fri Oct 7 16:38:12 2005 @@ -160,7 +160,7 @@ dom0_op_t op; op.u.getdomaininfolist.first_domain = first_domain; op.u.getdomaininfolist.max_domains = max_domains; - op.u.getdomaininfolist.buffer = info; + xenif_pack_ptr(op.u.getdomaininfolist.buffer, info); if (mlock( info, max_domains * sizeof(dom0_getdomaininfo_t)) < 0) { perror("Failed to mlock domaininfo array"); @@ -182,7 +182,7 @@ dom0_op_t op; op.u.getvcpucontext.domain = domain; op.u.getvcpucontext.vcpu = vcpu; - op.u.getvcpucontext.ctxt = NULL; + xenif_pack_ptr(op.u.getvcpucontext.ctxt, NULL); if (xi_make_dom0_op(handle, &op, DOM0_GETVCPUCONTEXT) < 0) { perror("DOM0_GETVCPUCONTEXT Hypercall failed"); diff -r 85f92475b943 xen/arch/ia64/xen/dom0_ops.c --- a/xen/arch/ia64/xen/dom0_ops.c Mon Oct 3 18:14:02 2005 +++ b/xen/arch/ia64/xen/dom0_ops.c Fri Oct 7 16:38:12 2005 @@ -73,10 +73,12 @@ 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; + unsigned long *s_ptr; struct domain *d; unsigned long *l_arr; ret = -ESRCH; + + xenif_unpack_ptr(s_ptr, op->u.getpageframeinfo2.array); if ( unlikely((d = find_domain_by_id(dom)) == NULL) ) break; @@ -159,8 +161,10 @@ unsigned long start_page = op->u.getmemlist.max_pfns >> 32; unsigned long nr_pages = op->u.getmemlist.max_pfns & 0xffffffff; unsigned long pfn; - unsigned long *buffer = op->u.getmemlist.buffer; + unsigned long *buffer; struct page *page; + + xenif_unpack_ptr(buffer, op->u.getmemlist.buffer); ret = -EINVAL; if ( d != NULL ) diff -r 85f92475b943 xen/arch/x86/dom0_ops.c --- a/xen/arch/x86/dom0_ops.c Mon Oct 3 18:14:02 2005 +++ b/xen/arch/x86/dom0_ops.c Fri Oct 7 16:38:12 2005 @@ -132,7 +132,10 @@ case DOM0_MICROCODE: { extern int microcode_update(void *buf, unsigned long len); - ret = microcode_update(op->u.microcode.data, op->u.microcode.length); + void *data; + + xenif_unpack_ptr(data, op->u.microcode.data); + ret = microcode_update(data, op->u.microcode.length); } break; @@ -252,10 +255,12 @@ 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; + unsigned long *s_ptr; struct domain *d; unsigned long *l_arr; ret = -ESRCH; + + xenif_unpack_ptr(s_ptr, op->u.getpageframeinfo2.array); if ( unlikely((d = find_domain_by_id(dom)) == NULL) ) break; @@ -343,8 +348,10 @@ struct domain *d = find_domain_by_id(op->u.getmemlist.domain); unsigned long max_pfns = op->u.getmemlist.max_pfns; unsigned long pfn; - unsigned long *buffer = op->u.getmemlist.buffer; + unsigned long *buffer; struct list_head *list_ent; + + xenif_unpack_ptr(buffer, op->u.getmemlist.buffer); ret = -EINVAL; if ( d != NULL ) @@ -395,7 +402,10 @@ case DOM0_PHYSICAL_MEMORY_MAP: { struct dom0_memory_map_entry entry; + struct dom0_memory_map_entry *memory_map; int i; + + xenif_unpack_ptr(memory_map, op->u.physical_memory_map.memory_map); for ( i = 0; i < e820.nr_map; i++ ) { @@ -404,9 +414,7 @@ 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_user(&memory_map[i], &entry, sizeof(entry)); } op->u.physical_memory_map.nr_map_entries = i; diff -r 85f92475b943 xen/arch/x86/shadow32.c --- a/xen/arch/x86/shadow32.c Mon Oct 3 18:14:02 2005 +++ b/xen/arch/x86/shadow32.c Fri Oct 7 16:38:12 2005 @@ -1224,6 +1224,9 @@ unsigned int op = sc->op; int i, rc = 0; struct vcpu *v; + unsigned long *dirty_bitmap; + + xenif_unpack_ptr(dirty_bitmap, sc->dirty_bitmap); ASSERT(shadow_lock_is_acquired(d)); @@ -1260,7 +1263,7 @@ d->arch.shadow_dirty_block_count = 0; if ( (d->max_pages > sc->pages) || - (sc->dirty_bitmap == NULL) || + (dirty_bitmap == NULL) || (d->arch.shadow_dirty_bitmap == NULL) ) { rc = -EINVAL; @@ -1276,7 +1279,7 @@ chunk : (d->max_pages - i)) + 7) / 8; if (copy_to_user( - sc->dirty_bitmap + (i/(8*sizeof(unsigned long))), + dirty_bitmap + (i/(8*sizeof(unsigned long))), d->arch.shadow_dirty_bitmap +(i/(8*sizeof(unsigned long))), bytes)) { @@ -1304,7 +1307,7 @@ sc->stats.dirty_block_count = d->arch.shadow_dirty_block_count; if ( (d->max_pages > sc->pages) || - (sc->dirty_bitmap == NULL) || + (dirty_bitmap == NULL) || (d->arch.shadow_dirty_bitmap == NULL) ) { rc = -EINVAL; @@ -1313,7 +1316,7 @@ sc->pages = d->max_pages; if (copy_to_user( - sc->dirty_bitmap, d->arch.shadow_dirty_bitmap, (d->max_pages+7)/8)) + dirty_bitmap, d->arch.shadow_dirty_bitmap, (d->max_pages+7)/8)) { rc = -EINVAL; break; diff -r 85f92475b943 xen/arch/x86/shadow_public.c --- a/xen/arch/x86/shadow_public.c Mon Oct 3 18:14:02 2005 +++ b/xen/arch/x86/shadow_public.c Fri Oct 7 16:38:12 2005 @@ -1143,6 +1143,9 @@ unsigned int op = sc->op; int i, rc = 0; struct vcpu *v; + unsigned long *dirty_bitmap; + + xenif_unpack_ptr(dirty_bitmap, sc->dirty_bitmap); ASSERT(shadow_lock_is_acquired(d)); @@ -1179,7 +1182,7 @@ d->arch.shadow_dirty_block_count = 0; if ( (d->max_pages > sc->pages) || - (sc->dirty_bitmap == NULL) || + (dirty_bitmap == NULL) || (d->arch.shadow_dirty_bitmap == NULL) ) { rc = -EINVAL; @@ -1195,7 +1198,7 @@ chunk : (d->max_pages - i)) + 7) / 8; if (copy_to_user( - sc->dirty_bitmap + (i/(8*sizeof(unsigned long))), + dirty_bitmap + (i/(8*sizeof(unsigned long))), d->arch.shadow_dirty_bitmap +(i/(8*sizeof(unsigned long))), bytes)) { @@ -1222,7 +1225,7 @@ sc->stats.dirty_block_count = d->arch.shadow_dirty_block_count; if ( (d->max_pages > sc->pages) || - (sc->dirty_bitmap == NULL) || + (dirty_bitmap == NULL) || (d->arch.shadow_dirty_bitmap == NULL) ) { rc = -EINVAL; @@ -1231,7 +1234,7 @@ sc->pages = d->max_pages; if (copy_to_user( - sc->dirty_bitmap, d->arch.shadow_dirty_bitmap, (d->max_pages+7)/8)) + dirty_bitmap, d->arch.shadow_dirty_bitmap, (d->max_pages+7)/8)) { rc = -EINVAL; break; diff -r 85f92475b943 xen/common/dom0_ops.c --- a/xen/common/dom0_ops.c Mon Oct 3 18:14:02 2005 +++ b/xen/common/dom0_ops.c Fri Oct 7 16:38:12 2005 @@ -249,8 +249,10 @@ domid_t dom = op->u.pincpudomain.domain; struct domain *d = find_domain_by_id(dom); struct vcpu *v; + cpumap_t *cpumap_ptr; cpumap_t cpumap; + xenif_unpack_ptr(cpumap_ptr, op->u.pincpudomain.cpumap); if ( d == NULL ) { @@ -281,8 +283,7 @@ break; } - if ( copy_from_user(&cpumap, op->u.pincpudomain.cpumap, - sizeof(cpumap)) ) + if ( copy_from_user(&cpumap, cpumap_ptr, sizeof(cpumap)) ) { ret = -EFAULT; put_domain(d); @@ -359,8 +360,10 @@ { struct domain *d; dom0_getdomaininfo_t info; - dom0_getdomaininfo_t *buffer = op->u.getdomaininfolist.buffer; + dom0_getdomaininfo_t *buffer; u32 num_domains = 0; + + xenif_unpack_ptr(buffer, op->u.getdomaininfolist.buffer); read_lock(&domlist_lock); @@ -405,10 +408,13 @@ case DOM0_GETVCPUCONTEXT: { struct vcpu_guest_context *c; + struct vcpu_guest_context *ctxt; struct domain *d; struct vcpu *v; int i; + xenif_unpack_ptr(ctxt, op->u.getvcpucontext.ctxt); + d = find_domain_by_id(op->u.getvcpucontext.domain); if ( d == NULL ) { @@ -441,7 +447,7 @@ op->u.getvcpucontext.cpu_time = v->cpu_time; - if ( op->u.getvcpucontext.ctxt != NULL ) + if ( ctxt != NULL ) { if ( (c = xmalloc(struct vcpu_guest_context)) == NULL ) { @@ -458,7 +464,7 @@ if ( v != current ) vcpu_unpause(v); - if ( copy_to_user(op->u.getvcpucontext.ctxt, c, sizeof(*c)) ) + if ( copy_to_user(ctxt, c, sizeof(*c)) ) ret = -EINVAL; xfree(c); @@ -491,10 +497,13 @@ case DOM0_READCONSOLE: { + char *buffer; + xenif_unpack_ptr(buffer, op->u.readconsole.buffer); ret = read_console_ring( - &op->u.readconsole.buffer, + &buffer, &op->u.readconsole.count, op->u.readconsole.clear); + xenif_pack_ptr(op->u.readconsole.buffer, buffer); copy_to_user(u_dom0_op, op, sizeof(*op)); } break; diff -r 85f92475b943 xen/common/domain.c --- a/xen/common/domain.c Mon Oct 3 18:14:02 2005 +++ b/xen/common/domain.c Fri Oct 7 16:38:12 2005 @@ -338,8 +338,11 @@ { int rc = 0; struct vcpu_guest_context *c = NULL; + struct vcpu_guest_context *ctxt; unsigned long vcpu = setdomaininfo->vcpu; struct vcpu *v; + + xenif_unpack_ptr(ctxt, setdomaininfo->ctxt); if ( (vcpu >= MAX_VIRT_CPUS) || ((v = d->vcpu[vcpu]) == NULL) ) return -EINVAL; @@ -351,7 +354,7 @@ if ( (c = xmalloc(struct vcpu_guest_context)) == NULL ) return -ENOMEM; - if ( copy_from_user(c, setdomaininfo->ctxt, sizeof(*c)) ) + if ( copy_from_user(c, ctxt, sizeof(*c)) ) { rc = -EFAULT; goto out; diff -r 85f92475b943 xen/common/perfc.c --- a/xen/common/perfc.c Mon Oct 3 18:14:02 2005 +++ b/xen/common/perfc.c Fri Oct 7 16:38:12 2005 @@ -203,10 +203,13 @@ /* Dom0 control of perf counters */ int perfc_control(dom0_perfccontrol_t *pc) { + dom0_perfc_desc_t *desc; static spinlock_t lock = SPIN_LOCK_UNLOCKED; u32 op = pc->op; int rc; + xenif_unpack_ptr(pc->desc, desc); + pc->nr_counters = NR_PERFCTRS; spin_lock(&lock); @@ -214,13 +217,13 @@ switch ( op ) { case DOM0_PERFCCONTROL_OP_RESET: - perfc_copy_info(pc->desc); + perfc_copy_info(desc); perfc_reset(0); rc = 0; break; case DOM0_PERFCCONTROL_OP_QUERY: - perfc_copy_info(pc->desc); + perfc_copy_info(desc); rc = 0; break; diff -r 85f92475b943 xen/include/public/arch-x86_32.h --- a/xen/include/public/arch-x86_32.h Mon Oct 3 18:14:02 2005 +++ b/xen/include/public/arch-x86_32.h Fri Oct 7 16:38:12 2005 @@ -62,6 +62,11 @@ #define MAX_VIRT_CPUS 32 #ifndef __ASSEMBLY__ + +#define XENIF_PTR(type, field) struct { type val; } field ## _struct +#define xenif_pack_ptr(field, var) do { field ## _struct.val = var; } while (0) +#define xenif_unpack_ptr(var, field) do { var = field ## _struct.val; } while (0) +typedef unsigned long xenif_ulong_t; /* * Send an array of these to HYPERVISOR_set_trap_table() diff -r 85f92475b943 xen/include/public/dom0_ops.h --- a/xen/include/public/dom0_ops.h Mon Oct 3 18:14:02 2005 +++ b/xen/include/public/dom0_ops.h Fri Oct 7 16:38:12 2005 @@ -15,6 +15,17 @@ #include "sched_ctl.h" /* + * Do not use type "long" in these structures. Because "long" changes size + * between 32- and 64-bit builds, it will preclude mixing 32- and 64-bit tools, + * kernels, and hypervisor. If a variable needs to be 64 bits wide under any + * circumstances, declare it as a u64 instead. + * + * Pointers have the same problem. The XENIF_PTR macro is used to ensure that, + * on some architectures, a pointer is always 64 bits wide. + */ + + +/* * Make sure you increment the interface version whenever you modify this file! * This makes sure that old versions of dom0 tools will stop working in a * well-defined way (rather than crashing the machine, for instance). @@ -27,10 +38,10 @@ typedef struct { /* IN variables. */ domid_t domain; - unsigned long max_pfns; - void *buffer; - /* OUT variables. */ - unsigned long num_pfns; + xenif_ulong_t max_pfns; + XENIF_PTR(void*, buffer); + /* OUT variables. */ + xenif_ulong_t num_pfns; } dom0_getmemlist_t; #define DOM0_SCHEDCTL 6 @@ -83,9 +94,9 @@ #define DOMFLAGS_SHUTDOWNMASK 255 /* DOMFLAGS_SHUTDOWN guest-supplied code. */ #define DOMFLAGS_SHUTDOWNSHIFT 16 u32 flags; - unsigned long tot_pages; - unsigned long max_pages; - unsigned long shared_info_frame; /* MFN of shared_info struct */ + xenif_ulong_t tot_pages; + xenif_ulong_t max_pages; + xenif_ulong_t shared_info_frame; /* MFN of shared_info struct */ u64 cpu_time; u32 n_vcpu; s32 vcpu_to_cpu[MAX_VIRT_CPUS]; /* current mapping */ @@ -99,7 +110,7 @@ domid_t domain; u16 vcpu; /* IN/OUT parameters */ - vcpu_guest_context_t *ctxt; + XENIF_PTR(vcpu_guest_context_t *, ctxt); } dom0_setdomaininfo_t; #define DOM0_MSR 15 @@ -155,7 +166,7 @@ typedef struct { /* IN variables. */ - unsigned long pfn; /* Machine page frame number to query. */ + xenif_ulong_t pfn; /* Machine page frame number to query. */ domid_t domain; /* To which domain does the frame belong? */ /* OUT variables. */ /* Is the page PINNED to a type? */ @@ -170,7 +181,7 @@ /* IN variables. */ u32 clear; /* Non-zero -> clear after reading. */ /* IN/OUT variables. */ - char *buffer; /* In: Buffer start; Out: Used buffer start */ + XENIF_PTR(char *, buffer); /* In: Buffer start; Out: Used buffer start */ u32 count; /* In: Buffer size; Out: Used buffer size */ } dom0_readconsole_t; @@ -182,7 +193,7 @@ /* IN variables. */ domid_t domain; u16 vcpu; - cpumap_t *cpumap; + XENIF_PTR(cpumap_t *, cpumap); } dom0_pincpudomain_t; /* Get trace buffers machine base address */ @@ -194,10 +205,10 @@ #define DOM0_TBUF_SET_EVT_MASK 2 u8 op; /* IN/OUT variables */ - unsigned long cpu_mask; + xenif_ulong_t cpu_mask; u32 evt_mask; /* OUT variables */ - unsigned long buffer_mfn; + xenif_ulong_t buffer_mfn; u32 size; } dom0_tbufcontrol_t; @@ -211,8 +222,8 @@ u32 sockets_per_node; u32 nr_nodes; u32 cpu_khz; - unsigned long total_pages; - unsigned long free_pages; + xenif_ulong_t total_pages; + xenif_ulong_t free_pages; u32 hw_cap[8]; } dom0_physinfo_t; @@ -251,9 +262,9 @@ /* IN variables. */ domid_t domain; u32 op; - unsigned long *dirty_bitmap; /* pointer to locked buffer */ + XENIF_PTR(unsigned long *, dirty_bitmap); /* pointer to locked buffer */ /* IN/OUT variables. */ - unsigned long pages; /* size of buffer, updated with actual size */ + xenif_ulong_t pages; /* size of buffer, updated with actual size */ /* OUT variables. */ dom0_shadow_control_stats_t stats; } dom0_shadow_control_t; @@ -262,16 +273,16 @@ typedef struct { /* IN variables. */ domid_t domain; - unsigned long max_memkb; + xenif_ulong_t max_memkb; } dom0_setdomainmaxmem_t; #define DOM0_GETPAGEFRAMEINFO2 29 /* batched interface */ typedef struct { /* IN variables. */ domid_t domain; - unsigned long num; + xenif_ulong_t num; /* IN/OUT variables. */ - unsigned long *array; + XENIF_PTR(unsigned long *, array); } dom0_getpageframeinfo2_t; /* @@ -284,8 +295,8 @@ #define DOM0_ADD_MEMTYPE 31 typedef struct { /* IN variables. */ - unsigned long pfn; - unsigned long nr_pfns; + xenif_ulong_t pfn; + xenif_ulong_t nr_pfns; u32 type; /* OUT variables. */ u32 handle; @@ -312,8 +323,8 @@ /* IN variables. */ u32 reg; /* OUT variables. */ - unsigned long pfn; - unsigned long nr_pfns; + xenif_ulong_t pfn; + xenif_ulong_t nr_pfns; u32 type; } dom0_read_memtype_t; @@ -332,13 +343,13 @@ u32 op; /* DOM0_PERFCCONTROL_OP_??? */ /* OUT variables. */ u32 nr_counters; /* number of counters */ - dom0_perfc_desc_t *desc; /* counter information (or NULL) */ + XENIF_PTR(dom0_perfc_desc_t *, desc); /* counter information (or NULL) */ } dom0_perfccontrol_t; #define DOM0_MICROCODE 35 typedef struct { /* IN variables. */ - void *data; /* Pointer to microcode data */ + XENIF_PTR(void *, data); /* Pointer to microcode data */ u32 length; /* Length of microcode data. */ } dom0_microcode_t; @@ -354,7 +365,7 @@ typedef struct { domid_t domain; /* domain to be affected */ u16 vcpu; /* vcpu # */ - vcpu_guest_context_t *ctxt; /* NB. IN/OUT variable. */ + XENIF_PTR(vcpu_guest_context_t *, ctxt); /* NB. IN/OUT variable. */ u64 cpu_time; } dom0_getvcpucontext_t; @@ -363,7 +374,7 @@ /* IN variables. */ domid_t first_domain; unsigned int max_domains; - dom0_getdomaininfo_t *buffer; + XENIF_PTR(dom0_getdomaininfo_t *, buffer); /* OUT variables. */ unsigned int num_domains; } dom0_getdomaininfolist_t; @@ -376,15 +387,16 @@ } dom0_platform_quirk_t; #define DOM0_PHYSICAL_MEMORY_MAP 40 +struct dom0_memory_map_entry { + u64 start, end; + int is_ram; +}; typedef struct { /* IN variables. */ int max_map_entries; /* OUT variables. */ int nr_map_entries; - struct dom0_memory_map_entry { - u64 start, end; - int is_ram; - } *memory_map; + XENIF_PTR(struct dom0_memory_map_entry *, memory_map); } dom0_physical_memory_map_t; typedef struct {