Ian Campbell
2012-Oct-15 15:20 UTC
[PATCH v2 00/10] 64 bit ARM ABI, map foreign gmfn API, ARM grant tables
This is v2 of "Sweep through arm-for-4.3 branch + a bit extra" retitled since most of the sweep through stuff has been swept through already and just the bit extra remains. I''ve addressed the review comments and fixed the bisection issue. A bunch of this stuff is cross arch and/or touches common code. The Linux side of the 64 bit ARM ABI changes are in mainline Linux already (just a few tweaks and cleanups remain). xen: arm: implement XENMEM_add_to_physmap_range New hypercall intended for use by both ARM (Linux patches exist) and x86 PVH (TBD) xen/arm: grant table Simple wiring up job. Acked but depends on XENMEM_add_to_physmap_range. arm: tools: add arm to foreign structs checking Fixes native tools build on ARM xen: xen_ulong_t substitution xen: change the limit of nr_extents to UINT_MAX >> MEMOP_EXTENT_SHIFT xen: introduce XEN_GUEST_HANDLE_PARAM xen: replace XEN_GUEST_HANDLE with XEN_GUEST_HANDLE_PARAM when appropriate xen: more XEN_GUEST_HANDLE_PARAM substitutions xen: remove XEN_GUEST_HANDLE(ulong) arm: parameter guest handles are 32 bit on 32 bit hypervisor These are the ARM 64 bit API, mostly from Stefano and posted several times already. Ian.
Ian Campbell
2012-Oct-15 15:20 UTC
[PATCH 01/10] xen: arm: implement XENMEM_add_to_physmap_range
This allows for foreign mappings as well as batching, fitting all that into XENMEM_add_to_physmap wasn''t possible. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> Cc: keir@xen.org Cc: Jan Beulich <JBeulich@suse.com> Cc: Mukesh Rathor <mukesh.rathor@oracle.com> --- xen/arch/arm/mm.c | 120 ++++++++++++++++++++++++++++++++++++++----- xen/include/public/memory.h | 40 +++++++++++--- xen/include/public/xen.h | 1 + 3 files changed, 139 insertions(+), 22 deletions(-) diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c index b0068d2..591ad3a 100644 --- a/xen/arch/arm/mm.c +++ b/xen/arch/arm/mm.c @@ -25,6 +25,8 @@ #include <xen/mm.h> #include <xen/preempt.h> #include <xen/errno.h> +#include <xen/softirq.h> +#include <xen/event.h> #include <xen/guest_access.h> #include <xen/domain_page.h> #include <asm/page.h> @@ -459,37 +461,96 @@ void share_xen_page_with_guest(struct page_info *page, spin_unlock(&d->page_alloc_lock); } -static int xenmem_add_to_physmap_once( +static int xenmem_add_to_physmap_one( struct domain *d, - const struct xen_add_to_physmap *xatp) + uint16_t space, + domid_t foreign_domid, + unsigned long idx, + xen_pfn_t gpfn) { unsigned long mfn = 0; int rc; - switch ( xatp->space ) + switch ( space ) { - case XENMAPSPACE_shared_info: - if ( xatp->idx == 0 ) - mfn = virt_to_mfn(d->shared_info); - break; - default: - return -ENOSYS; + case XENMAPSPACE_shared_info: + if ( idx == 0 ) + mfn = virt_to_mfn(d->shared_info); + break; + case XENMAPSPACE_gmfn_foreign: + { + paddr_t maddr; + struct domain *od; + rc = rcu_lock_target_domain_by_id(foreign_domid, &od); + if ( rc < 0 ) + return rc; + + maddr = p2m_lookup(od, idx << PAGE_SHIFT); + if ( maddr == INVALID_PADDR ) + { + dump_p2m_lookup(od, idx << PAGE_SHIFT); + rcu_unlock_domain(od); + return -EINVAL; + } + + mfn = maddr >> PAGE_SHIFT; + + rcu_unlock_domain(od); + break; + } + + default: + return -ENOSYS; } domain_lock(d); /* Map at new location. */ - rc = guest_physmap_add_page(d, xatp->gpfn, mfn, 0); + rc = guest_physmap_add_page(d, gpfn, mfn, 0); domain_unlock(d); return rc; } -static int xenmem_add_to_physmap(struct domain *d, - struct xen_add_to_physmap *xatp) +static int xenmem_add_to_physmap_range(struct domain *d, + struct xen_add_to_physmap_range *xatpr) { - return xenmem_add_to_physmap_once(d, xatp); + int rc; + + /* Process entries in reverse order to allow continuations */ + while ( xatpr->size > 0 ) + { + xen_ulong_t idx; + xen_pfn_t gpfn; + + rc = copy_from_guest_offset(&idx, xatpr->idxs, xatpr->size-1, 1); + if ( rc < 0 ) + goto out; + + rc = copy_from_guest_offset(&gpfn, xatpr->gpfns, xatpr->size-1, 1); + if ( rc < 0 ) + goto out; + + rc = xenmem_add_to_physmap_one(d, xatpr->space, + xatpr->foreign_domid, + idx, gpfn); + + xatpr->size--; + + /* Check for continuation if it''s not the last interation */ + if ( xatpr->size > 0 && hypercall_preempt_check() ) + { + rc = -EAGAIN; + goto out; + } + } + + rc = 0; + +out: + return rc; + } long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg) @@ -506,14 +567,45 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg) if ( copy_from_guest(&xatp, arg, 1) ) return -EFAULT; + /* This one is only supported by add_to_physmap_range */ + if ( xatp.space == XENMAPSPACE_gmfn_foreign ) + return -EINVAL; + rc = rcu_lock_target_domain_by_id(xatp.domid, &d); if ( rc != 0 ) return rc; - rc = xenmem_add_to_physmap(d, &xatp); + rc = xenmem_add_to_physmap_one(d, xatp.space, DOMID_INVALID, + xatp.idx, xatp.gpfn); + + rcu_unlock_domain(d); + + return rc; + } + + case XENMEM_add_to_physmap_range: + { + struct xen_add_to_physmap_range xatpr; + struct domain *d; + + if ( copy_from_guest(&xatpr, arg, 1) ) + return -EFAULT; + + rc = rcu_lock_target_domain_by_id(xatpr.domid, &d); + if ( rc != 0 ) + return rc; + + rc = xenmem_add_to_physmap_range(d, &xatpr); rcu_unlock_domain(d); + if ( rc && copy_to_guest(arg, &xatpr, 1) ) + rc = -EFAULT; + + if ( rc == -EAGAIN ) + rc = hypercall_create_continuation( + __HYPERVISOR_memory_op, "ih", op, arg); + return rc; } diff --git a/xen/include/public/memory.h b/xen/include/public/memory.h index 86d02c8..f1ddbc0 100644 --- a/xen/include/public/memory.h +++ b/xen/include/public/memory.h @@ -198,6 +198,15 @@ struct xen_machphys_mapping { typedef struct xen_machphys_mapping xen_machphys_mapping_t; DEFINE_XEN_GUEST_HANDLE(xen_machphys_mapping_t); +/* Source mapping space. */ +/* ` enum phys_map_space { */ +#define XENMAPSPACE_shared_info 0 /* shared info page */ +#define XENMAPSPACE_grant_table 1 /* grant table page */ +#define XENMAPSPACE_gmfn 2 /* GMFN */ +#define XENMAPSPACE_gmfn_range 3 /* GMFN range */ +#define XENMAPSPACE_gmfn_foreign 4 /* GMFN from another dom */ +/* ` } */ + /* * Sets the GPFN at which a particular page appears in the specified guest''s * pseudophysical address space. @@ -211,24 +220,39 @@ struct xen_add_to_physmap { /* Number of pages to go through for gmfn_range */ uint16_t size; - /* Source mapping space. */ -#define XENMAPSPACE_shared_info 0 /* shared info page */ -#define XENMAPSPACE_grant_table 1 /* grant table page */ -#define XENMAPSPACE_gmfn 2 /* GMFN */ -#define XENMAPSPACE_gmfn_range 3 /* GMFN range */ - unsigned int space; + unsigned int space; /* => enum phys_map_space */ #define XENMAPIDX_grant_table_status 0x80000000 - /* Index into source mapping space. */ + /* Index into space being mapped. */ xen_ulong_t idx; - /* GPFN where the source mapping page should appear. */ + /* GPFN in domid where the source mapping page should appear. */ xen_pfn_t gpfn; }; typedef struct xen_add_to_physmap xen_add_to_physmap_t; DEFINE_XEN_GUEST_HANDLE(xen_add_to_physmap_t); +/* A batched version of add_to_physmap. */ +#define XENMEM_add_to_physmap_range 23 +struct xen_add_to_physmap_range { + /* Which domain to change the mapping for. */ + domid_t domid; + uint16_t space; /* => enum phys_map_space */ + + /* Number of pages to go through */ + uint16_t size; + domid_t foreign_domid; /* IFF gmfn_foreign */ + + /* Indexes into space being mapped. */ + XEN_GUEST_HANDLE(xen_ulong_t) idxs; + + /* GPFN in domdwhere the source mapping page should appear. */ + XEN_GUEST_HANDLE(xen_pfn_t) gpfns; +}; +typedef struct xen_add_to_physmap_range xen_add_to_physmap_range_t; +DEFINE_XEN_GUEST_HANDLE(xen_add_to_physmap_range_t); + /* * Unmaps the page appearing at a particular GPFN from the specified guest''s * pseudophysical address space. diff --git a/xen/include/public/xen.h b/xen/include/public/xen.h index 361398b..e42d01f 100644 --- a/xen/include/public/xen.h +++ b/xen/include/public/xen.h @@ -49,6 +49,7 @@ DEFINE_XEN_GUEST_HANDLE(void); DEFINE_XEN_GUEST_HANDLE(uint64_t); DEFINE_XEN_GUEST_HANDLE(xen_pfn_t); +DEFINE_XEN_GUEST_HANDLE(xen_ulong_t); #endif /* -- 1.7.9.1
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Implement XENMAPSPACE_grant_table and grant_table_op. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Acked-by: Tim Deegan <tim@xen.org> [ ijc -- fixed reject in traps.c, grant table op is a 3 argument hypercall, rebased over "xen: arm: implement XENMEM_add_to_physmap_range" ] Signed-off-by: Ian Campbell <ian.campbell@citrix.com> --- xen/arch/arm/mm.c | 26 ++++++++++++++++++++++++++ xen/arch/arm/traps.c | 1 + 2 files changed, 27 insertions(+), 0 deletions(-) diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c index 591ad3a..edd5ca7 100644 --- a/xen/arch/arm/mm.c +++ b/xen/arch/arm/mm.c @@ -25,6 +25,7 @@ #include <xen/mm.h> #include <xen/preempt.h> #include <xen/errno.h> +#include <xen/grant_table.h> #include <xen/softirq.h> #include <xen/event.h> #include <xen/guest_access.h> @@ -473,6 +474,31 @@ static int xenmem_add_to_physmap_one( switch ( space ) { + case XENMAPSPACE_grant_table: + spin_lock(&d->grant_table->lock); + + if ( d->grant_table->gt_version == 0 ) + d->grant_table->gt_version = 1; + + if ( d->grant_table->gt_version == 2 && + (idx & XENMAPIDX_grant_table_status) ) + { + idx &= ~XENMAPIDX_grant_table_status; + if ( idx < nr_status_frames(d->grant_table) ) + mfn = virt_to_mfn(d->grant_table->status[idx]); + } + else + { + if ( (idx >= nr_grant_frames(d->grant_table)) && + (idx < max_nr_grant_frames) ) + gnttab_grow_table(d, idx + 1); + + if ( idx < nr_grant_frames(d->grant_table) ) + mfn = virt_to_mfn(d->grant_table->shared_raw[idx]); + } + + spin_unlock(&d->grant_table->lock); + break; case XENMAPSPACE_shared_info: if ( idx == 0 ) mfn = virt_to_mfn(d->shared_info); diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c index 98cc750..19e2081 100644 --- a/xen/arch/arm/traps.c +++ b/xen/arch/arm/traps.c @@ -438,6 +438,7 @@ static arm_hypercall_t arm_hypercall_table[] = { HYPERCALL(physdev_op, 2), HYPERCALL(sysctl, 2), HYPERCALL(hvm_op, 2), + HYPERCALL(grant_table_op, 3), }; static void do_debug_trap(struct cpu_user_regs *regs, unsigned int code) -- 1.7.9.1
Ian Campbell
2012-Oct-15 15:20 UTC
[PATCH 03/10] arm: tools: add arm to foreign structs checking
Signed-off-by: Ian Campbell <ian.campbell@citrix.com> --- tools/include/xen-foreign/Makefile | 5 ++++- tools/include/xen-foreign/mkheader.py | 7 +++++++ tools/include/xen-foreign/reference.size | 20 ++++++++++---------- tools/include/xen-foreign/structs.py | 7 ++++++- 4 files changed, 27 insertions(+), 12 deletions(-) diff --git a/tools/include/xen-foreign/Makefile b/tools/include/xen-foreign/Makefile index 8b22b10..cfaf790 100644 --- a/tools/include/xen-foreign/Makefile +++ b/tools/include/xen-foreign/Makefile @@ -3,7 +3,7 @@ include $(XEN_ROOT)/tools/Rules.mk ROOT = $(XEN_ROOT)/xen/include/public -architectures := x86_32 x86_64 +architectures := arm x86_32 x86_64 headers := $(patsubst %, %.h, $(architectures)) .PHONY: all clean check-headers @@ -22,6 +22,9 @@ check-headers: checker diff -u reference.size tmp.size rm tmp.size +arm.h: mkheader.py structs.py $(ROOT)/arch-arm.h + $(PYTHON) $< $* $@ $(filter %.h,$^) + x86_32.h: mkheader.py structs.py $(ROOT)/arch-x86/xen-x86_32.h $(ROOT)/arch-x86/xen.h $(ROOT)/xen.h $(PYTHON) $< $* $@ $(filter %.h,$^) diff --git a/tools/include/xen-foreign/mkheader.py b/tools/include/xen-foreign/mkheader.py index 797a880..d189b07 100644 --- a/tools/include/xen-foreign/mkheader.py +++ b/tools/include/xen-foreign/mkheader.py @@ -16,6 +16,13 @@ inttypes = {}; header = {}; footer = {}; +#arm +inttypes["arm"] = { + "unsigned long" : "uint32_t", + "long" : "uint32_t", + "xen_pfn_t" : "uint64_t", +}; + # x86_32 inttypes["x86_32"] = { "unsigned long" : "uint32_t", diff --git a/tools/include/xen-foreign/reference.size b/tools/include/xen-foreign/reference.size index fac1b1d..a2cbfd6 100644 --- a/tools/include/xen-foreign/reference.size +++ b/tools/include/xen-foreign/reference.size @@ -1,13 +1,13 @@ -structs | x86_32 x86_64 +structs | arm x86_32 x86_64 -start_info | 1112 1168 -trap_info | 8 16 -cpu_user_regs | 68 200 -vcpu_guest_context | 2800 5168 -arch_vcpu_info | 24 16 -vcpu_time_info | 32 32 -vcpu_info | 64 64 -arch_shared_info | 268 280 -shared_info | 2584 3368 +start_info | - 1112 1168 +trap_info | - 8 16 +cpu_user_regs | 160 68 200 +vcpu_guest_context | 180 2800 5168 +arch_vcpu_info | - 24 16 +vcpu_time_info | - 32 32 +vcpu_info | - 64 64 +arch_shared_info | - 268 280 +shared_info | - 2584 3368 diff --git a/tools/include/xen-foreign/structs.py b/tools/include/xen-foreign/structs.py index 571f7bb..51a77c0 100644 --- a/tools/include/xen-foreign/structs.py +++ b/tools/include/xen-foreign/structs.py @@ -13,9 +13,14 @@ structs = [ "start_info", "arch_shared_info", "shared_info" ]; -defines = [ "__i386__", +defines = [ "__arm__", + "__i386__", "__x86_64__", + # arm + # None + + # x86_{32,64} "FLAT_RING1_CS", "FLAT_RING1_DS", "FLAT_RING1_SS", -- 1.7.9.1
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com> There is still an unwanted unsigned long in the xen public interface: replace it with xen_ulong_t. Also typedef xen_ulong_t to uint64_t on ARM. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Signed-off-by: Ian Campbell <ian.campbell@citrix.com> Cc: keir@xen.org Cc: JBeulich@suse.com --- Changes in v2: - do not replace the unsigned long in x86 specific calls; - do not replace the unsigned long in multicall_entry; - add missing include "xen.h" in version.h; - use proper printf flag for xen_ulong_t. --- tools/python/xen/lowlevel/xc/xc.c | 2 +- xen/include/public/arch-arm.h | 3 ++- xen/include/public/arch-x86/xen.h | 1 + xen/include/public/version.h | 4 +++- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/tools/python/xen/lowlevel/xc/xc.c b/tools/python/xen/lowlevel/xc/xc.c index 7c89756..e220f68 100644 --- a/tools/python/xen/lowlevel/xc/xc.c +++ b/tools/python/xen/lowlevel/xc/xc.c @@ -1439,7 +1439,7 @@ static PyObject *pyxc_xeninfo(XcObject *self) if ( xc_version(self->xc_handle, XENVER_commandline, &xen_commandline) != 0 ) return pyxc_error_to_exception(self->xc_handle); - snprintf(str, sizeof(str), "virt_start=0x%lx", p_parms.virt_start); + snprintf(str, sizeof(str), "virt_start=0x%"PRI_xen_ulong, p_parms.virt_start); xen_pagesize = xc_version(self->xc_handle, XENVER_pagesize, NULL); if (xen_pagesize < 0 ) diff --git a/xen/include/public/arch-arm.h b/xen/include/public/arch-arm.h index e3d4ad9..2ae6548 100644 --- a/xen/include/public/arch-arm.h +++ b/xen/include/public/arch-arm.h @@ -122,7 +122,8 @@ typedef uint64_t xen_pfn_t; /* Only one. All other VCPUS must use VCPUOP_register_vcpu_info */ #define XEN_LEGACY_MAX_VCPUS 1 -typedef uint32_t xen_ulong_t; +typedef uint64_t xen_ulong_t; +#define PRI_xen_ulong PRIx64 struct vcpu_guest_context { #define _VGCF_online 0 diff --git a/xen/include/public/arch-x86/xen.h b/xen/include/public/arch-x86/xen.h index 1c186d7..fff8824 100644 --- a/xen/include/public/arch-x86/xen.h +++ b/xen/include/public/arch-x86/xen.h @@ -85,6 +85,7 @@ typedef unsigned long xen_pfn_t; #ifndef __ASSEMBLY__ typedef unsigned long xen_ulong_t; +#define PRI_xen_ulong "lx" /* * ` enum neg_errnoval diff --git a/xen/include/public/version.h b/xen/include/public/version.h index 8742c2b..c7e6f8c 100644 --- a/xen/include/public/version.h +++ b/xen/include/public/version.h @@ -28,6 +28,8 @@ #ifndef __XEN_PUBLIC_VERSION_H__ #define __XEN_PUBLIC_VERSION_H__ +#include "xen.h" + /* NB. All ops return zero on success, except XENVER_{version,pagesize} */ /* arg == NULL; returns major:minor (16:16). */ @@ -58,7 +60,7 @@ typedef char xen_changeset_info_t[64]; #define XENVER_platform_parameters 5 struct xen_platform_parameters { - unsigned long virt_start; + xen_ulong_t virt_start; }; typedef struct xen_platform_parameters xen_platform_parameters_t; -- 1.7.9.1
Ian Campbell
2012-Oct-15 15:20 UTC
[PATCH 05/10] xen: change the limit of nr_extents to UINT_MAX >> MEMOP_EXTENT_SHIFT
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Currently do_memory_op has a different maximum limit for nr_extents on 32 bit and 64 bit. Change the limit to UINT_MAX >> MEMOP_EXTENT_SHIFT, so that it is the same in both cases. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Signed-off-by: Ian Campbell <ian.campbell@citrix.com> Cc: keir@xen.org Cc: JBeulich@suse.com --- xen/common/memory.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/xen/common/memory.c b/xen/common/memory.c index 5bcb035..401d06c 100644 --- a/xen/common/memory.c +++ b/xen/common/memory.c @@ -540,7 +540,7 @@ long do_memory_op(unsigned long cmd, XEN_GUEST_HANDLE(void) arg) return start_extent; /* Is size too large for us to encode a continuation? */ - if ( reservation.nr_extents > (ULONG_MAX >> MEMOP_EXTENT_SHIFT) ) + if ( reservation.nr_extents > (UINT_MAX >> MEMOP_EXTENT_SHIFT) ) return start_extent; if ( unlikely(start_extent >= reservation.nr_extents) ) -- 1.7.9.1
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com> XEN_GUEST_HANDLE_PARAM is going to be used to distinguish guest pointers stored in memory from guest pointers as hypercall parameters. guest_handle_* macros default to XEN_GUEST_HANDLE_PARAM as return type. Two new guest_handle_to_param and guest_handle_from_param macros are introduced to do conversions. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Signed-off-by: Ian Campbell <ian.campbell@citrix.com> Cc: keir@xen.org Cc: JBeulich@suse.com --- Changes in v2: - add 2 missing #define _XEN_GUEST_HANDLE_PARAM for the compilation of the compat code. Changes in v3: - move the guest_handle_cast change into this patch; - add a clear comment on top of guest_handle_cast; - also s/XEN_GUEST_HANDLE/XEN_GUEST_HANDLE_PARAM in guest_handle_from_ptr and const_guest_handle_from_ptr; - introduce guest_handle_from_param and guest_handle_to_param. Changes in v4: - make both XEN_GUEST_HANDLE and XEN_GUEST_HANDLE_PARAM unions on ARM; - simplify set_xen_guest_handle_raw on ARM; - add type checking in guest_handle_to_param and guest_handle_from_param trivial. Changes in v5 (ijc): - Fix arm''s set_xen_guest_handle_raw which mixed up t and _t. Use a more unique variable name for the benefit of -Wshadow. Changes in v6 (ijc): - Defer change of XEN_GUEST_HANDLE_PARAM on ARM until later in order to not break the build during this and subsequent transitional patches --- xen/include/asm-arm/guest_access.h | 32 ++++++++++++++++++++++++++++---- xen/include/asm-x86/guest_access.h | 29 +++++++++++++++++++++++++---- xen/include/public/arch-arm.h | 26 ++++++++++++++++++++++---- xen/include/public/arch-x86/xen.h | 9 +++++++++ xen/include/xen/xencomm.h | 22 +++++++++++++++++++++- 5 files changed, 105 insertions(+), 13 deletions(-) diff --git a/xen/include/asm-arm/guest_access.h b/xen/include/asm-arm/guest_access.h index 0fceae6..5686217 100644 --- a/xen/include/asm-arm/guest_access.h +++ b/xen/include/asm-arm/guest_access.h @@ -27,16 +27,40 @@ unsigned long raw_clear_guest(void *to, unsigned len); #define guest_handle_add_offset(hnd, nr) ((hnd).p += (nr)) #define guest_handle_subtract_offset(hnd, nr) ((hnd).p -= (nr)) -/* Cast a guest handle to the specified type of handle. */ +/* Cast a guest handle (either XEN_GUEST_HANDLE or XEN_GUEST_HANDLE_PARAM) + * to the specified type of XEN_GUEST_HANDLE_PARAM. */ #define guest_handle_cast(hnd, type) ({ \ type *_x = (hnd).p; \ - (XEN_GUEST_HANDLE(type)) { _x }; \ + (XEN_GUEST_HANDLE_PARAM(type)) { _x }; \ +}) + +/* Cast a XEN_GUEST_HANDLE to XEN_GUEST_HANDLE_PARAM */ +#define guest_handle_to_param(hnd, type) ({ \ + typeof((hnd).p) _x = (hnd).p; \ + XEN_GUEST_HANDLE_PARAM(type) _y = { _x }; \ + /* type checking: make sure that the pointers inside \ + * XEN_GUEST_HANDLE and XEN_GUEST_HANDLE_PARAM are of \ + * the same type, then return hnd */ \ + (void)(&_x == &_y.p); \ + _y; \ +}) + + +/* Cast a XEN_GUEST_HANDLE_PARAM to XEN_GUEST_HANDLE */ +#define guest_handle_from_param(hnd, type) ({ \ + typeof((hnd).p) _x = (hnd).p; \ + XEN_GUEST_HANDLE(type) _y = { _x }; \ + /* type checking: make sure that the pointers inside \ + * XEN_GUEST_HANDLE and XEN_GUEST_HANDLE_PARAM are of \ + * the same type, then return hnd */ \ + (void)(&_x == &_y.p); \ + _y; \ }) #define guest_handle_from_ptr(ptr, type) \ - ((XEN_GUEST_HANDLE(type)) { (type *)ptr }) + ((XEN_GUEST_HANDLE_PARAM(type)) { (type *)ptr }) #define const_guest_handle_from_ptr(ptr, type) \ - ((XEN_GUEST_HANDLE(const_##type)) { (const type *)ptr }) + ((XEN_GUEST_HANDLE_PARAM(const_##type)) { (const type *)ptr }) /* * Copy an array of objects to guest context via a guest handle, diff --git a/xen/include/asm-x86/guest_access.h b/xen/include/asm-x86/guest_access.h index e3ac1d6..ca700c9 100644 --- a/xen/include/asm-x86/guest_access.h +++ b/xen/include/asm-x86/guest_access.h @@ -45,19 +45,40 @@ #define guest_handle_add_offset(hnd, nr) ((hnd).p += (nr)) #define guest_handle_subtract_offset(hnd, nr) ((hnd).p -= (nr)) -/* Cast a guest handle to the specified type of handle. */ +/* Cast a guest handle (either XEN_GUEST_HANDLE or XEN_GUEST_HANDLE_PARAM) + * to the specified type of XEN_GUEST_HANDLE_PARAM. */ #define guest_handle_cast(hnd, type) ({ \ type *_x = (hnd).p; \ - (XEN_GUEST_HANDLE(type)) { _x }; \ + (XEN_GUEST_HANDLE_PARAM(type)) { _x }; \ +}) + +/* Cast a XEN_GUEST_HANDLE to XEN_GUEST_HANDLE_PARAM */ +#define guest_handle_to_param(hnd, type) ({ \ + /* type checking: make sure that the pointers inside \ + * XEN_GUEST_HANDLE and XEN_GUEST_HANDLE_PARAM are of \ + * the same type, then return hnd */ \ + (void)((typeof(&(hnd).p)) 0 == \ + (typeof(&((XEN_GUEST_HANDLE_PARAM(type)) {}).p)) 0); \ + (hnd); \ +}) + +/* Cast a XEN_GUEST_HANDLE_PARAM to XEN_GUEST_HANDLE */ +#define guest_handle_from_param(hnd, type) ({ \ + /* type checking: make sure that the pointers inside \ + * XEN_GUEST_HANDLE and XEN_GUEST_HANDLE_PARAM are of \ + * the same type, then return hnd */ \ + (void)((typeof(&(hnd).p)) 0 == \ + (typeof(&((XEN_GUEST_HANDLE_PARAM(type)) {}).p)) 0); \ + (hnd); \ }) #define guest_handle_for_field(hnd, type, fld) \ ((XEN_GUEST_HANDLE(type)) { &(hnd).p->fld }) #define guest_handle_from_ptr(ptr, type) \ - ((XEN_GUEST_HANDLE(type)) { (type *)ptr }) + ((XEN_GUEST_HANDLE_PARAM(type)) { (type *)ptr }) #define const_guest_handle_from_ptr(ptr, type) \ - ((XEN_GUEST_HANDLE(const_##type)) { (const type *)ptr }) + ((XEN_GUEST_HANDLE_PARAM(const_##type)) { (const type *)ptr }) /* * Copy an array of objects to guest context via a guest handle, diff --git a/xen/include/public/arch-arm.h b/xen/include/public/arch-arm.h index 2ae6548..ac493a5 100644 --- a/xen/include/public/arch-arm.h +++ b/xen/include/public/arch-arm.h @@ -51,18 +51,36 @@ #define XEN_HYPERCALL_TAG 0XEA1 +#define uint64_aligned_t uint64_t __attribute__((aligned(8))) #ifndef __ASSEMBLY__ -#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \ - typedef struct { type *p; } __guest_handle_ ## name +#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \ + typedef union { type *p; unsigned long q; } \ + __guest_handle_ ## name; \ + typedef union { type *p; uint64_aligned_t q; } \ + __guest_handle_64_ ## name; +/* + * XEN_GUEST_HANDLE represents a guest pointer, when passed as a field + * in a struct in memory. On ARM is always 8 bytes sizes and 8 bytes + * aligned. + * XEN_GUEST_HANDLE_PARAM represent a guest pointer, when passed as an + * hypercall argument. It is 4 bytes on aarch and 8 bytes on aarch64. + */ #define __DEFINE_XEN_GUEST_HANDLE(name, type) \ ___DEFINE_XEN_GUEST_HANDLE(name, type); \ ___DEFINE_XEN_GUEST_HANDLE(const_##name, const type) #define DEFINE_XEN_GUEST_HANDLE(name) __DEFINE_XEN_GUEST_HANDLE(name, name) -#define __XEN_GUEST_HANDLE(name) __guest_handle_ ## name +#define __XEN_GUEST_HANDLE(name) __guest_handle_64_ ## name #define XEN_GUEST_HANDLE(name) __XEN_GUEST_HANDLE(name) -#define set_xen_guest_handle_raw(hnd, val) do { (hnd).p = val; } while (0) +/* this is going to be changed on 64 bit */ +#define XEN_GUEST_HANDLE_PARAM(name) XEN_GUEST_HANDLE(name) +#define set_xen_guest_handle_raw(hnd, val) \ + do { \ + typeof(&(hnd)) _sxghr_tmp = &(hnd); \ + _sxghr_tmp->q = 0; \ + _sxghr_tmp->p = val; \ + } while ( 0 ) #ifdef __XEN_TOOLS__ #define get_xen_guest_handle(val, hnd) do { val = (hnd).p; } while (0) #endif diff --git a/xen/include/public/arch-x86/xen.h b/xen/include/public/arch-x86/xen.h index fff8824..f5c58a6 100644 --- a/xen/include/public/arch-x86/xen.h +++ b/xen/include/public/arch-x86/xen.h @@ -38,12 +38,21 @@ typedef type * __guest_handle_ ## name #endif +/* + * XEN_GUEST_HANDLE represents a guest pointer, when passed as a field + * in a struct in memory. + * XEN_GUEST_HANDLE_PARAM represent a guest pointer, when passed as an + * hypercall argument. + * XEN_GUEST_HANDLE_PARAM and XEN_GUEST_HANDLE are the same on X86 but + * they might not be on other architectures. + */ #define __DEFINE_XEN_GUEST_HANDLE(name, type) \ ___DEFINE_XEN_GUEST_HANDLE(name, type); \ ___DEFINE_XEN_GUEST_HANDLE(const_##name, const type) #define DEFINE_XEN_GUEST_HANDLE(name) __DEFINE_XEN_GUEST_HANDLE(name, name) #define __XEN_GUEST_HANDLE(name) __guest_handle_ ## name #define XEN_GUEST_HANDLE(name) __XEN_GUEST_HANDLE(name) +#define XEN_GUEST_HANDLE_PARAM(name) XEN_GUEST_HANDLE(name) #define set_xen_guest_handle_raw(hnd, val) do { (hnd).p = val; } while (0) #ifdef __XEN_TOOLS__ #define get_xen_guest_handle(val, hnd) do { val = (hnd).p; } while (0) diff --git a/xen/include/xen/xencomm.h b/xen/include/xen/xencomm.h index 730da7c..3426b8a 100644 --- a/xen/include/xen/xencomm.h +++ b/xen/include/xen/xencomm.h @@ -66,11 +66,31 @@ static inline unsigned long xencomm_inline_addr(const void *handle) /* Cast a guest handle to the specified type of handle. */ #define guest_handle_cast(hnd, type) ({ \ type *_x = (hnd).p; \ - XEN_GUEST_HANDLE(type) _y; \ + XEN_GUEST_HANDLE_PARAM(type) _y; \ set_xen_guest_handle(_y, _x); \ _y; \ }) +/* Cast a XEN_GUEST_HANDLE to XEN_GUEST_HANDLE_PARAM */ +#define guest_handle_to_param(hnd, type) ({ \ + /* type checking: make sure that the pointers inside \ + * XEN_GUEST_HANDLE and XEN_GUEST_HANDLE_PARAM are of \ + * the same type, then return hnd */ \ + (void)((typeof(&(hnd).p)) 0 == \ + (typeof(&((XEN_GUEST_HANDLE_PARAM(type)) {}).p)) 0); \ + (hnd); \ +}) + +/* Cast a XEN_GUEST_HANDLE_PARAM to XEN_GUEST_HANDLE */ +#define guest_handle_from_param(hnd, type) ({ \ + /* type checking: make sure that the pointers inside \ + * XEN_GUEST_HANDLE and XEN_GUEST_HANDLE_PARAM are of \ + * the same type, then return hnd */ \ + (void)((typeof(&(hnd).p)) 0 == \ + (typeof(&((XEN_GUEST_HANDLE_PARAM(type)) {}).p)) 0); \ + (hnd); \ +}) + /* Since we run in real mode, we can safely access all addresses. That also * means our __routines are identical to our "normal" routines. */ #define guest_handle_okay(hnd, nr) 1 -- 1.7.9.1
Ian Campbell
2012-Oct-15 15:20 UTC
[PATCH 07/10] xen: replace XEN_GUEST_HANDLE with XEN_GUEST_HANDLE_PARAM when appropriate
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Note: these changes don''t make any difference on x86. Replace XEN_GUEST_HANDLE with XEN_GUEST_HANDLE_PARAM when it is used as an hypercall argument. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Signed-off-by: Ian Campbell <ian.campbell@citrix.com> Cc: keir@xen.org Cc: JBeulich@suse.com --- ijc v2: - correct usage of guest handle paramters in tmem - defer some changes to next patch to avoid temporarily breaking the build. --- xen/arch/arm/domain.c | 2 +- xen/arch/arm/domctl.c | 2 +- xen/arch/arm/hvm.c | 2 +- xen/arch/arm/mm.c | 2 +- xen/arch/arm/physdev.c | 2 +- xen/arch/arm/sysctl.c | 2 +- xen/arch/x86/compat.c | 2 +- xen/arch/x86/cpu/mcheck/mce.c | 2 +- xen/arch/x86/domain.c | 2 +- xen/arch/x86/domctl.c | 2 +- xen/arch/x86/efi/runtime.c | 2 +- xen/arch/x86/hvm/hvm.c | 26 +++++++++--------- xen/arch/x86/microcode.c | 2 +- xen/arch/x86/mm.c | 14 +++++----- xen/arch/x86/mm/hap/hap.c | 2 +- xen/arch/x86/mm/mem_event.c | 2 +- xen/arch/x86/mm/paging.c | 2 +- xen/arch/x86/mm/shadow/common.c | 2 +- xen/arch/x86/oprofile/xenoprof.c | 6 ++-- xen/arch/x86/physdev.c | 2 +- xen/arch/x86/sysctl.c | 2 +- xen/arch/x86/traps.c | 2 +- xen/arch/x86/x86_64/compat/mm.c | 10 +++--- xen/arch/x86/x86_64/domain.c | 2 +- xen/arch/x86/x86_64/mm.c | 2 +- xen/arch/x86/x86_64/traps.c | 2 +- xen/common/compat/domain.c | 2 +- xen/common/compat/grant_table.c | 8 +++--- xen/common/compat/memory.c | 4 +- xen/common/domain.c | 2 +- xen/common/domctl.c | 2 +- xen/common/event_channel.c | 2 +- xen/common/grant_table.c | 36 +++++++++++++------------- xen/common/kernel.c | 4 +- xen/common/kexec.c | 17 ++++++------ xen/common/memory.c | 4 +- xen/common/schedule.c | 2 +- xen/common/sysctl.c | 2 +- xen/common/tmem.c | 45 ++++++++++++++++++-------------- xen/common/tmem_xen.c | 8 +++--- xen/common/xenoprof.c | 8 +++--- xen/drivers/acpi/pmstat.c | 2 +- xen/drivers/char/console.c | 6 ++-- xen/drivers/passthrough/iommu.c | 2 +- xen/include/asm-arm/hypercall.h | 2 +- xen/include/asm-arm/mm.h | 2 +- xen/include/asm-x86/hap.h | 2 +- xen/include/asm-x86/hypercall.h | 22 ++++++++-------- xen/include/asm-x86/mem_event.h | 2 +- xen/include/asm-x86/mm.h | 8 +++--- xen/include/asm-x86/paging.h | 2 +- xen/include/asm-x86/processor.h | 2 +- xen/include/asm-x86/shadow.h | 2 +- xen/include/asm-x86/xenoprof.h | 6 ++-- xen/include/xen/acpi.h | 4 +- xen/include/xen/compat.h | 3 ++ xen/include/xen/hypercall.h | 52 +++++++++++++++++++------------------- xen/include/xen/iommu.h | 2 +- xen/include/xen/tmem_xen.h | 18 ++++++++----- xen/include/xsm/xsm.h | 4 +- xen/xsm/dummy.c | 2 +- xen/xsm/flask/flask_op.c | 4 +- xen/xsm/flask/hooks.c | 2 +- xen/xsm/xsm_core.c | 2 +- 64 files changed, 206 insertions(+), 193 deletions(-) diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c index f47db4f..c5292c7 100644 --- a/xen/arch/arm/domain.c +++ b/xen/arch/arm/domain.c @@ -519,7 +519,7 @@ void arch_dump_domain_info(struct domain *d) { } -long arch_do_vcpu_op(int cmd, struct vcpu *v, XEN_GUEST_HANDLE(void) arg) +long arch_do_vcpu_op(int cmd, struct vcpu *v, XEN_GUEST_HANDLE_PARAM(void) arg) { return -ENOSYS; } diff --git a/xen/arch/arm/domctl.c b/xen/arch/arm/domctl.c index 1a5f79f..cf16791 100644 --- a/xen/arch/arm/domctl.c +++ b/xen/arch/arm/domctl.c @@ -11,7 +11,7 @@ #include <public/domctl.h> long arch_do_domctl(struct xen_domctl *domctl, - XEN_GUEST_HANDLE(xen_domctl_t) u_domctl) + XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl) { return -ENOSYS; } diff --git a/xen/arch/arm/hvm.c b/xen/arch/arm/hvm.c index c11378d..40f519e 100644 --- a/xen/arch/arm/hvm.c +++ b/xen/arch/arm/hvm.c @@ -11,7 +11,7 @@ #include <asm/hypercall.h> -long do_hvm_op(unsigned long op, XEN_GUEST_HANDLE(void) arg) +long do_hvm_op(unsigned long op, XEN_GUEST_HANDLE_PARAM(void) arg) { long rc = 0; diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c index edd5ca7..e8fff8f 100644 --- a/xen/arch/arm/mm.c +++ b/xen/arch/arm/mm.c @@ -579,7 +579,7 @@ out: } -long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg) +long arch_memory_op(int op, XEN_GUEST_HANDLE_PARAM(void) arg) { int rc; diff --git a/xen/arch/arm/physdev.c b/xen/arch/arm/physdev.c index bcf4337..0801e8c 100644 --- a/xen/arch/arm/physdev.c +++ b/xen/arch/arm/physdev.c @@ -11,7 +11,7 @@ #include <asm/hypercall.h> -int do_physdev_op(int cmd, XEN_GUEST_HANDLE(void) arg) +int do_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg) { printk("%s %d cmd=%d: not implemented yet\n", __func__, __LINE__, cmd); return -ENOSYS; diff --git a/xen/arch/arm/sysctl.c b/xen/arch/arm/sysctl.c index e8e1c0d..a286abe 100644 --- a/xen/arch/arm/sysctl.c +++ b/xen/arch/arm/sysctl.c @@ -13,7 +13,7 @@ #include <public/sysctl.h> long arch_do_sysctl(struct xen_sysctl *sysctl, - XEN_GUEST_HANDLE(xen_sysctl_t) u_sysctl) + XEN_GUEST_HANDLE_PARAM(xen_sysctl_t) u_sysctl) { return -ENOSYS; } diff --git a/xen/arch/x86/compat.c b/xen/arch/x86/compat.c index a4fda06..2d05867 100644 --- a/xen/arch/x86/compat.c +++ b/xen/arch/x86/compat.c @@ -27,7 +27,7 @@ ret_t do_physdev_op_compat(XEN_GUEST_HANDLE(physdev_op_t) uop) #ifndef COMPAT /* Legacy hypercall (as of 0x00030202). */ -long do_event_channel_op_compat(XEN_GUEST_HANDLE(evtchn_op_t) uop) +long do_event_channel_op_compat(XEN_GUEST_HANDLE_PARAM(evtchn_op_t) uop) { struct evtchn_op op; diff --git a/xen/arch/x86/cpu/mcheck/mce.c b/xen/arch/x86/cpu/mcheck/mce.c index 6f8c6f9..75f0f73 100644 --- a/xen/arch/x86/cpu/mcheck/mce.c +++ b/xen/arch/x86/cpu/mcheck/mce.c @@ -1289,7 +1289,7 @@ CHECK_mcinfo_recovery; # undef xen_mcinfo_recovery /* Machine Check Architecture Hypercall */ -long do_mca(XEN_GUEST_HANDLE(xen_mc_t) u_xen_mc) +long do_mca(XEN_GUEST_HANDLE_PARAM(xen_mc_t) u_xen_mc) { long ret = 0; struct xen_mc curop, *op = &curop; diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index 58766ba..233c597 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -1077,7 +1077,7 @@ map_vcpu_info(struct vcpu *v, unsigned long gfn, unsigned offset) long arch_do_vcpu_op( - int cmd, struct vcpu *v, XEN_GUEST_HANDLE(void) arg) + int cmd, struct vcpu *v, XEN_GUEST_HANDLE_PARAM(void) arg) { long rc = 0; diff --git a/xen/arch/x86/domctl.c b/xen/arch/x86/domctl.c index 24b3178..c3d6093 100644 --- a/xen/arch/x86/domctl.c +++ b/xen/arch/x86/domctl.c @@ -48,7 +48,7 @@ static int gdbsx_guest_mem_io( long arch_do_domctl( struct xen_domctl *domctl, - XEN_GUEST_HANDLE(xen_domctl_t) u_domctl) + XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl) { long ret = 0; diff --git a/xen/arch/x86/efi/runtime.c b/xen/arch/x86/efi/runtime.c index 1dbe2db..b2ff495 100644 --- a/xen/arch/x86/efi/runtime.c +++ b/xen/arch/x86/efi/runtime.c @@ -184,7 +184,7 @@ int efi_get_info(uint32_t idx, union xenpf_efi_info *info) return 0; } -static long gwstrlen(XEN_GUEST_HANDLE(CHAR16) str) +static long gwstrlen(XEN_GUEST_HANDLE_PARAM(CHAR16) str) { unsigned long len; diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index a5a1bcf..b83e336 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -3091,14 +3091,14 @@ static int grant_table_op_is_allowed(unsigned int cmd) } static long hvm_grant_table_op( - unsigned int cmd, XEN_GUEST_HANDLE(void) uop, unsigned int count) + unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) uop, unsigned int count) { if ( !grant_table_op_is_allowed(cmd) ) return -ENOSYS; /* all other commands need auditing */ return do_grant_table_op(cmd, uop, count); } -static long hvm_memory_op(int cmd, XEN_GUEST_HANDLE(void) arg) +static long hvm_memory_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg) { long rc; @@ -3116,7 +3116,7 @@ static long hvm_memory_op(int cmd, XEN_GUEST_HANDLE(void) arg) return do_memory_op(cmd, arg); } -static long hvm_physdev_op(int cmd, XEN_GUEST_HANDLE(void) arg) +static long hvm_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg) { switch ( cmd ) { @@ -3132,7 +3132,7 @@ static long hvm_physdev_op(int cmd, XEN_GUEST_HANDLE(void) arg) } static long hvm_vcpu_op( - int cmd, int vcpuid, XEN_GUEST_HANDLE(void) arg) + int cmd, int vcpuid, XEN_GUEST_HANDLE_PARAM(void) arg) { long rc; @@ -3163,7 +3163,7 @@ typedef unsigned long hvm_hypercall_t( [ __HYPERVISOR_ ## x ] = (hvm_hypercall_t *) do_ ## x static long hvm_grant_table_op_compat32(unsigned int cmd, - XEN_GUEST_HANDLE(void) uop, + XEN_GUEST_HANDLE_PARAM(void) uop, unsigned int count) { if ( !grant_table_op_is_allowed(cmd) ) @@ -3171,7 +3171,7 @@ static long hvm_grant_table_op_compat32(unsigned int cmd, return compat_grant_table_op(cmd, uop, count); } -static long hvm_memory_op_compat32(int cmd, XEN_GUEST_HANDLE(void) arg) +static long hvm_memory_op_compat32(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg) { int rc; @@ -3190,7 +3190,7 @@ static long hvm_memory_op_compat32(int cmd, XEN_GUEST_HANDLE(void) arg) } static long hvm_vcpu_op_compat32( - int cmd, int vcpuid, XEN_GUEST_HANDLE(void) arg) + int cmd, int vcpuid, XEN_GUEST_HANDLE_PARAM(void) arg) { long rc; @@ -3214,7 +3214,7 @@ static long hvm_vcpu_op_compat32( } static long hvm_physdev_op_compat32( - int cmd, XEN_GUEST_HANDLE(void) arg) + int cmd, XEN_GUEST_HANDLE_PARAM(void) arg) { switch ( cmd ) { @@ -3380,7 +3380,7 @@ void hvm_hypercall_page_initialise(struct domain *d, } static int hvmop_set_pci_intx_level( - XEN_GUEST_HANDLE(xen_hvm_set_pci_intx_level_t) uop) + XEN_GUEST_HANDLE_PARAM(xen_hvm_set_pci_intx_level_t) uop) { struct xen_hvm_set_pci_intx_level op; struct domain *d; @@ -3547,7 +3547,7 @@ static void hvm_s3_resume(struct domain *d) } static int hvmop_set_isa_irq_level( - XEN_GUEST_HANDLE(xen_hvm_set_isa_irq_level_t) uop) + XEN_GUEST_HANDLE_PARAM(xen_hvm_set_isa_irq_level_t) uop) { struct xen_hvm_set_isa_irq_level op; struct domain *d; @@ -3591,7 +3591,7 @@ static int hvmop_set_isa_irq_level( } static int hvmop_set_pci_link_route( - XEN_GUEST_HANDLE(xen_hvm_set_pci_link_route_t) uop) + XEN_GUEST_HANDLE_PARAM(xen_hvm_set_pci_link_route_t) uop) { struct xen_hvm_set_pci_link_route op; struct domain *d; @@ -3624,7 +3624,7 @@ static int hvmop_set_pci_link_route( } static int hvmop_inject_msi( - XEN_GUEST_HANDLE(xen_hvm_inject_msi_t) uop) + XEN_GUEST_HANDLE_PARAM(xen_hvm_inject_msi_t) uop) { struct xen_hvm_inject_msi op; struct domain *d; @@ -3708,7 +3708,7 @@ static int hvm_replace_event_channel(struct vcpu *v, domid_t remote_domid, return 0; } -long do_hvm_op(unsigned long op, XEN_GUEST_HANDLE(void) arg) +long do_hvm_op(unsigned long op, XEN_GUEST_HANDLE_PARAM(void) arg) { struct domain *curr_d = current->domain; diff --git a/xen/arch/x86/microcode.c b/xen/arch/x86/microcode.c index fe51034..fbbf95b 100644 --- a/xen/arch/x86/microcode.c +++ b/xen/arch/x86/microcode.c @@ -195,7 +195,7 @@ static long do_microcode_update(void *_info) return error; } -int microcode_update(XEN_GUEST_HANDLE(const_void) buf, unsigned long len) +int microcode_update(XEN_GUEST_HANDLE_PARAM(const_void) buf, unsigned long len) { int ret; struct microcode_info *info; diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index 8ab92c9..9a828de 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -2652,7 +2652,7 @@ static void put_pg_owner(struct domain *pg_owner) } static inline int vcpumask_to_pcpumask( - struct domain *d, XEN_GUEST_HANDLE(const_void) bmap, cpumask_t *pmask) + struct domain *d, XEN_GUEST_HANDLE_PARAM(const_void) bmap, cpumask_t *pmask) { unsigned int vcpu_id, vcpu_bias, offs; unsigned long vmask; @@ -2692,9 +2692,9 @@ static inline int vcpumask_to_pcpumask( #define fixunmap_domain_page(ptr) ((void)(ptr)) long do_mmuext_op( - XEN_GUEST_HANDLE(mmuext_op_t) uops, + XEN_GUEST_HANDLE_PARAM(mmuext_op_t) uops, unsigned int count, - XEN_GUEST_HANDLE(uint) pdone, + XEN_GUEST_HANDLE_PARAM(uint) pdone, unsigned int foreigndom) { struct mmuext_op op; @@ -3151,9 +3151,9 @@ long do_mmuext_op( } long do_mmu_update( - XEN_GUEST_HANDLE(mmu_update_t) ureqs, + XEN_GUEST_HANDLE_PARAM(mmu_update_t) ureqs, unsigned int count, - XEN_GUEST_HANDLE(uint) pdone, + XEN_GUEST_HANDLE_PARAM(uint) pdone, unsigned int foreigndom) { struct mmu_update req; @@ -4098,7 +4098,7 @@ long set_gdt(struct vcpu *v, } -long do_set_gdt(XEN_GUEST_HANDLE(ulong) frame_list, unsigned int entries) +long do_set_gdt(XEN_GUEST_HANDLE_PARAM(ulong) frame_list, unsigned int entries) { int nr_pages = (entries + 511) / 512; unsigned long frames[16]; @@ -4370,7 +4370,7 @@ static int xenmem_add_to_physmap(struct domain *d, return xenmem_add_to_physmap_once(d, xatp); } -long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg) +long arch_memory_op(int op, XEN_GUEST_HANDLE_PARAM(void) arg) { int rc; diff --git a/xen/arch/x86/mm/hap/hap.c b/xen/arch/x86/mm/hap/hap.c index d2637d3..fd99cde 100644 --- a/xen/arch/x86/mm/hap/hap.c +++ b/xen/arch/x86/mm/hap/hap.c @@ -571,7 +571,7 @@ void hap_teardown(struct domain *d) } int hap_domctl(struct domain *d, xen_domctl_shadow_op_t *sc, - XEN_GUEST_HANDLE(void) u_domctl) + XEN_GUEST_HANDLE_PARAM(void) u_domctl) { int rc, preempted = 0; diff --git a/xen/arch/x86/mm/mem_event.c b/xen/arch/x86/mm/mem_event.c index 942c19e..27d1cf4 100644 --- a/xen/arch/x86/mm/mem_event.c +++ b/xen/arch/x86/mm/mem_event.c @@ -512,7 +512,7 @@ void mem_event_cleanup(struct domain *d) } int mem_event_domctl(struct domain *d, xen_domctl_mem_event_op_t *mec, - XEN_GUEST_HANDLE(void) u_domctl) + XEN_GUEST_HANDLE_PARAM(void) u_domctl) { int rc; diff --git a/xen/arch/x86/mm/paging.c b/xen/arch/x86/mm/paging.c index ca879f9..ea44e39 100644 --- a/xen/arch/x86/mm/paging.c +++ b/xen/arch/x86/mm/paging.c @@ -654,7 +654,7 @@ void paging_vcpu_init(struct vcpu *v) int paging_domctl(struct domain *d, xen_domctl_shadow_op_t *sc, - XEN_GUEST_HANDLE(void) u_domctl) + XEN_GUEST_HANDLE_PARAM(void) u_domctl) { int rc; diff --git a/xen/arch/x86/mm/shadow/common.c b/xen/arch/x86/mm/shadow/common.c index 3f8ad88..ce79131 100644 --- a/xen/arch/x86/mm/shadow/common.c +++ b/xen/arch/x86/mm/shadow/common.c @@ -3641,7 +3641,7 @@ out: int shadow_domctl(struct domain *d, xen_domctl_shadow_op_t *sc, - XEN_GUEST_HANDLE(void) u_domctl) + XEN_GUEST_HANDLE_PARAM(void) u_domctl) { int rc, preempted = 0; diff --git a/xen/arch/x86/oprofile/xenoprof.c b/xen/arch/x86/oprofile/xenoprof.c index 160abac..90ef67d 100644 --- a/xen/arch/x86/oprofile/xenoprof.c +++ b/xen/arch/x86/oprofile/xenoprof.c @@ -17,7 +17,7 @@ #include "op_counter.h" -int xenoprof_arch_counter(XEN_GUEST_HANDLE(void) arg) +int xenoprof_arch_counter(XEN_GUEST_HANDLE_PARAM(void) arg) { struct xenoprof_counter counter; @@ -37,7 +37,7 @@ int xenoprof_arch_counter(XEN_GUEST_HANDLE(void) arg) return 0; } -int xenoprof_arch_ibs_counter(XEN_GUEST_HANDLE(void) arg) +int xenoprof_arch_ibs_counter(XEN_GUEST_HANDLE_PARAM(void) arg) { struct xenoprof_ibs_counter ibs_counter; @@ -54,7 +54,7 @@ int xenoprof_arch_ibs_counter(XEN_GUEST_HANDLE(void) arg) return 0; } -int compat_oprof_arch_counter(XEN_GUEST_HANDLE(void) arg) +int compat_oprof_arch_counter(XEN_GUEST_HANDLE_PARAM(void) arg) { struct compat_oprof_counter counter; diff --git a/xen/arch/x86/physdev.c b/xen/arch/x86/physdev.c index 984c813..751cbd4 100644 --- a/xen/arch/x86/physdev.c +++ b/xen/arch/x86/physdev.c @@ -258,7 +258,7 @@ int physdev_unmap_pirq(domid_t domid, int pirq) } #endif /* COMPAT */ -ret_t do_physdev_op(int cmd, XEN_GUEST_HANDLE(void) arg) +ret_t do_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg) { int irq; ret_t ret; diff --git a/xen/arch/x86/sysctl.c b/xen/arch/x86/sysctl.c index 379f071..b84dd34 100644 --- a/xen/arch/x86/sysctl.c +++ b/xen/arch/x86/sysctl.c @@ -58,7 +58,7 @@ long cpu_down_helper(void *data) } long arch_do_sysctl( - struct xen_sysctl *sysctl, XEN_GUEST_HANDLE(xen_sysctl_t) u_sysctl) + struct xen_sysctl *sysctl, XEN_GUEST_HANDLE_PARAM(xen_sysctl_t) u_sysctl) { long ret = 0; diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c index de08e25..dfaf78e 100644 --- a/xen/arch/x86/traps.c +++ b/xen/arch/x86/traps.c @@ -3536,7 +3536,7 @@ int send_guest_trap(struct domain *d, uint16_t vcpuid, unsigned int trap_nr) } -long do_set_trap_table(XEN_GUEST_HANDLE(const_trap_info_t) traps) +long do_set_trap_table(XEN_GUEST_HANDLE_PARAM(const_trap_info_t) traps) { struct trap_info cur; struct vcpu *curr = current; diff --git a/xen/arch/x86/x86_64/compat/mm.c b/xen/arch/x86/x86_64/compat/mm.c index f497503..d1eb785 100644 --- a/xen/arch/x86/x86_64/compat/mm.c +++ b/xen/arch/x86/x86_64/compat/mm.c @@ -5,7 +5,7 @@ #include <asm/mem_event.h> #include <asm/mem_sharing.h> -int compat_set_gdt(XEN_GUEST_HANDLE(uint) frame_list, unsigned int entries) +int compat_set_gdt(XEN_GUEST_HANDLE_PARAM(uint) frame_list, unsigned int entries) { unsigned int i, nr_pages = (entries + 511) / 512; unsigned long frames[16]; @@ -44,7 +44,7 @@ int compat_update_descriptor(u32 pa_lo, u32 pa_hi, u32 desc_lo, u32 desc_hi) desc_lo | ((u64)desc_hi << 32)); } -int compat_arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg) +int compat_arch_memory_op(int op, XEN_GUEST_HANDLE_PARAM(void) arg) { struct compat_machphys_mfn_list xmml; l2_pgentry_t l2e; @@ -260,14 +260,14 @@ int compat_update_va_mapping_otherdomain(unsigned long va, u32 lo, u32 hi, DEFINE_XEN_GUEST_HANDLE(mmuext_op_compat_t); -int compat_mmuext_op(XEN_GUEST_HANDLE(mmuext_op_compat_t) cmp_uops, +int compat_mmuext_op(XEN_GUEST_HANDLE_PARAM(mmuext_op_compat_t) cmp_uops, unsigned int count, - XEN_GUEST_HANDLE(uint) pdone, + XEN_GUEST_HANDLE_PARAM(uint) pdone, unsigned int foreigndom) { unsigned int i, preempt_mask; int rc = 0; - XEN_GUEST_HANDLE(mmuext_op_t) nat_ops; + XEN_GUEST_HANDLE_PARAM(mmuext_op_t) nat_ops; preempt_mask = count & MMU_UPDATE_PREEMPTED; count ^= preempt_mask; diff --git a/xen/arch/x86/x86_64/domain.c b/xen/arch/x86/x86_64/domain.c index e746c89..144ca2d 100644 --- a/xen/arch/x86/x86_64/domain.c +++ b/xen/arch/x86/x86_64/domain.c @@ -23,7 +23,7 @@ CHECK_vcpu_get_physid; int arch_compat_vcpu_op( - int cmd, struct vcpu *v, XEN_GUEST_HANDLE(void) arg) + int cmd, struct vcpu *v, XEN_GUEST_HANDLE_PARAM(void) arg) { int rc = -ENOSYS; diff --git a/xen/arch/x86/x86_64/mm.c b/xen/arch/x86/x86_64/mm.c index 1e001ea..35653b7 100644 --- a/xen/arch/x86/x86_64/mm.c +++ b/xen/arch/x86/x86_64/mm.c @@ -1027,7 +1027,7 @@ void __init subarch_init_memory(void) } } -long subarch_memory_op(int op, XEN_GUEST_HANDLE(void) arg) +long subarch_memory_op(int op, XEN_GUEST_HANDLE_PARAM(void) arg) { struct xen_machphys_mfn_list xmml; l3_pgentry_t l3e; diff --git a/xen/arch/x86/x86_64/traps.c b/xen/arch/x86/x86_64/traps.c index 3361d19..dfe0fac 100644 --- a/xen/arch/x86/x86_64/traps.c +++ b/xen/arch/x86/x86_64/traps.c @@ -519,7 +519,7 @@ static long unregister_guest_callback(struct callback_unregister *unreg) } -long do_callback_op(int cmd, XEN_GUEST_HANDLE(const_void) arg) +long do_callback_op(int cmd, XEN_GUEST_HANDLE_PARAM(const_void) arg) { long ret; diff --git a/xen/common/compat/domain.c b/xen/common/compat/domain.c index 40a0287..e4c8ceb 100644 --- a/xen/common/compat/domain.c +++ b/xen/common/compat/domain.c @@ -15,7 +15,7 @@ CHECK_vcpu_set_periodic_timer; #undef xen_vcpu_set_periodic_timer -int compat_vcpu_op(int cmd, int vcpuid, XEN_GUEST_HANDLE(void) arg) +int compat_vcpu_op(int cmd, int vcpuid, XEN_GUEST_HANDLE_PARAM(void) arg) { struct domain *d = current->domain; struct vcpu *v; diff --git a/xen/common/compat/grant_table.c b/xen/common/compat/grant_table.c index edd20c6..b524955 100644 --- a/xen/common/compat/grant_table.c +++ b/xen/common/compat/grant_table.c @@ -52,12 +52,12 @@ CHECK_gnttab_swap_grant_ref; #undef xen_gnttab_swap_grant_ref int compat_grant_table_op(unsigned int cmd, - XEN_GUEST_HANDLE(void) cmp_uop, + XEN_GUEST_HANDLE_PARAM(void) cmp_uop, unsigned int count) { int rc = 0; unsigned int i; - XEN_GUEST_HANDLE(void) cnt_uop; + XEN_GUEST_HANDLE_PARAM(void) cnt_uop; set_xen_guest_handle(cnt_uop, NULL); switch ( cmd ) @@ -206,7 +206,7 @@ int compat_grant_table_op(unsigned int cmd, } if ( rc >= 0 ) { - XEN_GUEST_HANDLE(gnttab_transfer_compat_t) xfer; + XEN_GUEST_HANDLE_PARAM(gnttab_transfer_compat_t) xfer; xfer = guest_handle_cast(cmp_uop, gnttab_transfer_compat_t); guest_handle_add_offset(xfer, i); @@ -251,7 +251,7 @@ int compat_grant_table_op(unsigned int cmd, } if ( rc >= 0 ) { - XEN_GUEST_HANDLE(gnttab_copy_compat_t) copy; + XEN_GUEST_HANDLE_PARAM(gnttab_copy_compat_t) copy; copy = guest_handle_cast(cmp_uop, gnttab_copy_compat_t); guest_handle_add_offset(copy, i); diff --git a/xen/common/compat/memory.c b/xen/common/compat/memory.c index e7257cc..996151c 100644 --- a/xen/common/compat/memory.c +++ b/xen/common/compat/memory.c @@ -13,7 +13,7 @@ CHECK_TYPE(domid); #undef compat_domid_t #undef xen_domid_t -int compat_memory_op(unsigned int cmd, XEN_GUEST_HANDLE(void) compat) +int compat_memory_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) compat) { int rc, split, op = cmd & MEMOP_CMD_MASK; unsigned int start_extent = cmd >> MEMOP_EXTENT_SHIFT; @@ -22,7 +22,7 @@ int compat_memory_op(unsigned int cmd, XEN_GUEST_HANDLE(void) compat) { unsigned int i, end_extent = 0; union { - XEN_GUEST_HANDLE(void) hnd; + XEN_GUEST_HANDLE_PARAM(void) hnd; struct xen_memory_reservation *rsrv; struct xen_memory_exchange *xchg; struct xen_remove_from_physmap *xrfp; diff --git a/xen/common/domain.c b/xen/common/domain.c index a1aa05e..6f98b54 100644 --- a/xen/common/domain.c +++ b/xen/common/domain.c @@ -806,7 +806,7 @@ void vcpu_reset(struct vcpu *v) } -long do_vcpu_op(int cmd, int vcpuid, XEN_GUEST_HANDLE(void) arg) +long do_vcpu_op(int cmd, int vcpuid, XEN_GUEST_HANDLE_PARAM(void) arg) { struct domain *d = current->domain; struct vcpu *v; diff --git a/xen/common/domctl.c b/xen/common/domctl.c index 2b1f182..e153cb4 100644 --- a/xen/common/domctl.c +++ b/xen/common/domctl.c @@ -239,7 +239,7 @@ void domctl_lock_release(void) spin_unlock(¤t->domain->hypercall_deadlock_mutex); } -long do_domctl(XEN_GUEST_HANDLE(xen_domctl_t) u_domctl) +long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl) { long ret = 0; struct xen_domctl curop, *op = &curop; diff --git a/xen/common/event_channel.c b/xen/common/event_channel.c index 53777f8..a80a0d1 100644 --- a/xen/common/event_channel.c +++ b/xen/common/event_channel.c @@ -970,7 +970,7 @@ out: } -long do_event_channel_op(int cmd, XEN_GUEST_HANDLE(void) arg) +long do_event_channel_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg) { long rc; diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c index c8e342b..f4ae9ee 100644 --- a/xen/common/grant_table.c +++ b/xen/common/grant_table.c @@ -833,7 +833,7 @@ __gnttab_map_grant_ref( static long gnttab_map_grant_ref( - XEN_GUEST_HANDLE(gnttab_map_grant_ref_t) uop, unsigned int count) + XEN_GUEST_HANDLE_PARAM(gnttab_map_grant_ref_t) uop, unsigned int count) { int i; struct gnttab_map_grant_ref op; @@ -1102,7 +1102,7 @@ __gnttab_unmap_grant_ref( static long gnttab_unmap_grant_ref( - XEN_GUEST_HANDLE(gnttab_unmap_grant_ref_t) uop, unsigned int count) + XEN_GUEST_HANDLE_PARAM(gnttab_unmap_grant_ref_t) uop, unsigned int count) { int i, c, partial_done, done = 0; struct gnttab_unmap_grant_ref op; @@ -1164,7 +1164,7 @@ __gnttab_unmap_and_replace( static long gnttab_unmap_and_replace( - XEN_GUEST_HANDLE(gnttab_unmap_and_replace_t) uop, unsigned int count) + XEN_GUEST_HANDLE_PARAM(gnttab_unmap_and_replace_t) uop, unsigned int count) { int i, c, partial_done, done = 0; struct gnttab_unmap_and_replace op; @@ -1316,7 +1316,7 @@ active_alloc_failed: static long gnttab_setup_table( - XEN_GUEST_HANDLE(gnttab_setup_table_t) uop, unsigned int count) + XEN_GUEST_HANDLE_PARAM(gnttab_setup_table_t) uop, unsigned int count) { struct gnttab_setup_table op; struct domain *d; @@ -1395,7 +1395,7 @@ gnttab_setup_table( static long gnttab_query_size( - XEN_GUEST_HANDLE(gnttab_query_size_t) uop, unsigned int count) + XEN_GUEST_HANDLE_PARAM(gnttab_query_size_t) uop, unsigned int count) { struct gnttab_query_size op; struct domain *d; @@ -1517,7 +1517,7 @@ gnttab_prepare_for_transfer( static long gnttab_transfer( - XEN_GUEST_HANDLE(gnttab_transfer_t) uop, unsigned int count) + XEN_GUEST_HANDLE_PARAM(gnttab_transfer_t) uop, unsigned int count) { struct domain *d = current->domain; struct domain *e; @@ -2125,7 +2125,7 @@ __gnttab_copy( static long gnttab_copy( - XEN_GUEST_HANDLE(gnttab_copy_t) uop, unsigned int count) + XEN_GUEST_HANDLE_PARAM(gnttab_copy_t) uop, unsigned int count) { int i; struct gnttab_copy op; @@ -2144,7 +2144,7 @@ gnttab_copy( } static long -gnttab_set_version(XEN_GUEST_HANDLE(gnttab_set_version_t uop)) +gnttab_set_version(XEN_GUEST_HANDLE_PARAM(gnttab_set_version_t uop)) { gnttab_set_version_t op; struct domain *d = current->domain; @@ -2263,7 +2263,7 @@ out: } static long -gnttab_get_status_frames(XEN_GUEST_HANDLE(gnttab_get_status_frames_t) uop, +gnttab_get_status_frames(XEN_GUEST_HANDLE_PARAM(gnttab_get_status_frames_t) uop, int count) { gnttab_get_status_frames_t op; @@ -2327,7 +2327,7 @@ out1: } static long -gnttab_get_version(XEN_GUEST_HANDLE(gnttab_get_version_t uop)) +gnttab_get_version(XEN_GUEST_HANDLE_PARAM(gnttab_get_version_t uop)) { gnttab_get_version_t op; struct domain *d; @@ -2412,7 +2412,7 @@ out: } static long -gnttab_swap_grant_ref(XEN_GUEST_HANDLE(gnttab_swap_grant_ref_t uop), +gnttab_swap_grant_ref(XEN_GUEST_HANDLE_PARAM(gnttab_swap_grant_ref_t uop), unsigned int count) { int i; @@ -2433,7 +2433,7 @@ gnttab_swap_grant_ref(XEN_GUEST_HANDLE(gnttab_swap_grant_ref_t uop), long do_grant_table_op( - unsigned int cmd, XEN_GUEST_HANDLE(void) uop, unsigned int count) + unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) uop, unsigned int count) { long rc; @@ -2445,7 +2445,7 @@ do_grant_table_op( { case GNTTABOP_map_grant_ref: { - XEN_GUEST_HANDLE(gnttab_map_grant_ref_t) map + XEN_GUEST_HANDLE_PARAM(gnttab_map_grant_ref_t) map guest_handle_cast(uop, gnttab_map_grant_ref_t); if ( unlikely(!guest_handle_okay(map, count)) ) goto out; @@ -2459,7 +2459,7 @@ do_grant_table_op( } case GNTTABOP_unmap_grant_ref: { - XEN_GUEST_HANDLE(gnttab_unmap_grant_ref_t) unmap + XEN_GUEST_HANDLE_PARAM(gnttab_unmap_grant_ref_t) unmap guest_handle_cast(uop, gnttab_unmap_grant_ref_t); if ( unlikely(!guest_handle_okay(unmap, count)) ) goto out; @@ -2473,7 +2473,7 @@ do_grant_table_op( } case GNTTABOP_unmap_and_replace: { - XEN_GUEST_HANDLE(gnttab_unmap_and_replace_t) unmap + XEN_GUEST_HANDLE_PARAM(gnttab_unmap_and_replace_t) unmap guest_handle_cast(uop, gnttab_unmap_and_replace_t); if ( unlikely(!guest_handle_okay(unmap, count)) ) goto out; @@ -2497,7 +2497,7 @@ do_grant_table_op( } case GNTTABOP_transfer: { - XEN_GUEST_HANDLE(gnttab_transfer_t) transfer + XEN_GUEST_HANDLE_PARAM(gnttab_transfer_t) transfer guest_handle_cast(uop, gnttab_transfer_t); if ( unlikely(!guest_handle_okay(transfer, count)) ) goto out; @@ -2511,7 +2511,7 @@ do_grant_table_op( } case GNTTABOP_copy: { - XEN_GUEST_HANDLE(gnttab_copy_t) copy + XEN_GUEST_HANDLE_PARAM(gnttab_copy_t) copy guest_handle_cast(uop, gnttab_copy_t); if ( unlikely(!guest_handle_okay(copy, count)) ) goto out; @@ -2548,7 +2548,7 @@ do_grant_table_op( } case GNTTABOP_swap_grant_ref: { - XEN_GUEST_HANDLE(gnttab_swap_grant_ref_t) swap + XEN_GUEST_HANDLE_PARAM(gnttab_swap_grant_ref_t) swap guest_handle_cast(uop, gnttab_swap_grant_ref_t); if ( unlikely(!guest_handle_okay(swap, count)) ) goto out; diff --git a/xen/common/kernel.c b/xen/common/kernel.c index c915bbc..55caff6 100644 --- a/xen/common/kernel.c +++ b/xen/common/kernel.c @@ -204,7 +204,7 @@ void __init do_initcalls(void) * Simple hypercalls. */ -DO(xen_version)(int cmd, XEN_GUEST_HANDLE(void) arg) +DO(xen_version)(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg) { switch ( cmd ) { @@ -332,7 +332,7 @@ DO(xen_version)(int cmd, XEN_GUEST_HANDLE(void) arg) return -ENOSYS; } -DO(nmi_op)(unsigned int cmd, XEN_GUEST_HANDLE(void) arg) +DO(nmi_op)(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg) { struct xennmi_callback cb; long rc = 0; diff --git a/xen/common/kexec.c b/xen/common/kexec.c index 2bc3e33..25ebd6a 100644 --- a/xen/common/kexec.c +++ b/xen/common/kexec.c @@ -613,7 +613,7 @@ static int kexec_get_range_internal(xen_kexec_range_t *range) return ret; } -static int kexec_get_range(XEN_GUEST_HANDLE(void) uarg) +static int kexec_get_range(XEN_GUEST_HANDLE_PARAM(void) uarg) { xen_kexec_range_t range; int ret = -EINVAL; @@ -629,7 +629,7 @@ static int kexec_get_range(XEN_GUEST_HANDLE(void) uarg) return ret; } -static int kexec_get_range_compat(XEN_GUEST_HANDLE(void) uarg) +static int kexec_get_range_compat(XEN_GUEST_HANDLE_PARAM(void) uarg) { #ifdef CONFIG_COMPAT xen_kexec_range_t range; @@ -777,7 +777,7 @@ static int kexec_load_unload_internal(unsigned long op, xen_kexec_load_t *load) return ret; } -static int kexec_load_unload(unsigned long op, XEN_GUEST_HANDLE(void) uarg) +static int kexec_load_unload(unsigned long op, XEN_GUEST_HANDLE_PARAM(void) uarg) { xen_kexec_load_t load; @@ -788,7 +788,7 @@ static int kexec_load_unload(unsigned long op, XEN_GUEST_HANDLE(void) uarg) } static int kexec_load_unload_compat(unsigned long op, - XEN_GUEST_HANDLE(void) uarg) + XEN_GUEST_HANDLE_PARAM(void) uarg) { #ifdef CONFIG_COMPAT compat_kexec_load_t compat_load; @@ -813,7 +813,7 @@ static int kexec_load_unload_compat(unsigned long op, #endif /* CONFIG_COMPAT */ } -static int kexec_exec(XEN_GUEST_HANDLE(void) uarg) +static int kexec_exec(XEN_GUEST_HANDLE_PARAM(void) uarg) { xen_kexec_exec_t exec; xen_kexec_image_t *image; @@ -845,7 +845,8 @@ static int kexec_exec(XEN_GUEST_HANDLE(void) uarg) return -EINVAL; /* never reached */ } -static int do_kexec_op_internal(unsigned long op, XEN_GUEST_HANDLE(void) uarg, +static int do_kexec_op_internal(unsigned long op, + XEN_GUEST_HANDLE_PARAM(void) uarg, bool_t compat) { unsigned long flags; @@ -886,13 +887,13 @@ static int do_kexec_op_internal(unsigned long op, XEN_GUEST_HANDLE(void) uarg, return ret; } -long do_kexec_op(unsigned long op, XEN_GUEST_HANDLE(void) uarg) +long do_kexec_op(unsigned long op, XEN_GUEST_HANDLE_PARAM(void) uarg) { return do_kexec_op_internal(op, uarg, 0); } #ifdef CONFIG_COMPAT -int compat_kexec_op(unsigned long op, XEN_GUEST_HANDLE(void) uarg) +int compat_kexec_op(unsigned long op, XEN_GUEST_HANDLE_PARAM(void) uarg) { return do_kexec_op_internal(op, uarg, 1); } diff --git a/xen/common/memory.c b/xen/common/memory.c index 401d06c..83e2666 100644 --- a/xen/common/memory.c +++ b/xen/common/memory.c @@ -277,7 +277,7 @@ static void decrease_reservation(struct memop_args *a) a->nr_done = i; } -static long memory_exchange(XEN_GUEST_HANDLE(xen_memory_exchange_t) arg) +static long memory_exchange(XEN_GUEST_HANDLE_PARAM(xen_memory_exchange_t) arg) { struct xen_memory_exchange exch; PAGE_LIST_HEAD(in_chunk_list); @@ -517,7 +517,7 @@ static long memory_exchange(XEN_GUEST_HANDLE(xen_memory_exchange_t) arg) return rc; } -long do_memory_op(unsigned long cmd, XEN_GUEST_HANDLE(void) arg) +long do_memory_op(unsigned long cmd, XEN_GUEST_HANDLE_PARAM(void) arg) { struct domain *d; int rc, op; diff --git a/xen/common/schedule.c b/xen/common/schedule.c index eee74be..00812ac 100644 --- a/xen/common/schedule.c +++ b/xen/common/schedule.c @@ -836,7 +836,7 @@ typedef long ret_t; #endif /* !COMPAT */ -ret_t do_sched_op(int cmd, XEN_GUEST_HANDLE(void) arg) +ret_t do_sched_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg) { ret_t ret = 0; diff --git a/xen/common/sysctl.c b/xen/common/sysctl.c index ea68278..47142f4 100644 --- a/xen/common/sysctl.c +++ b/xen/common/sysctl.c @@ -27,7 +27,7 @@ #include <xsm/xsm.h> #include <xen/pmstat.h> -long do_sysctl(XEN_GUEST_HANDLE(xen_sysctl_t) u_sysctl) +long do_sysctl(XEN_GUEST_HANDLE_PARAM(xen_sysctl_t) u_sysctl) { long ret = 0; struct xen_sysctl curop, *op = &curop; diff --git a/xen/common/tmem.c b/xen/common/tmem.c index ed322b6..1280537 100644 --- a/xen/common/tmem.c +++ b/xen/common/tmem.c @@ -1444,7 +1444,7 @@ static inline void tmem_ensure_avail_pages(void) /************ TMEM CORE OPERATIONS ************************************/ static NOINLINE int do_tmem_put_compress(pgp_t *pgp, tmem_cli_mfn_t cmfn, - tmem_cli_va_t clibuf) + tmem_cli_va_param_t clibuf) { void *dst, *p; size_t size; @@ -1488,7 +1488,7 @@ out: static NOINLINE int do_tmem_dup_put(pgp_t *pgp, tmem_cli_mfn_t cmfn, pagesize_t tmem_offset, pagesize_t pfn_offset, pagesize_t len, - tmem_cli_va_t clibuf) + tmem_cli_va_param_t clibuf) { pool_t *pool; obj_t *obj; @@ -1579,7 +1579,7 @@ cleanup: static NOINLINE int do_tmem_put(pool_t *pool, OID *oidp, uint32_t index, tmem_cli_mfn_t cmfn, pagesize_t tmem_offset, - pagesize_t pfn_offset, pagesize_t len, tmem_cli_va_t clibuf) + pagesize_t pfn_offset, pagesize_t len, tmem_cli_va_param_t clibuf) { obj_t *obj = NULL, *objfound = NULL, *objnew = NULL; pgp_t *pgp = NULL, *pgpdel = NULL; @@ -1722,7 +1722,7 @@ free: static NOINLINE int do_tmem_get(pool_t *pool, OID *oidp, uint32_t index, tmem_cli_mfn_t cmfn, pagesize_t tmem_offset, - pagesize_t pfn_offset, pagesize_t len, tmem_cli_va_t clibuf) + pagesize_t pfn_offset, pagesize_t len, tmem_cli_va_param_t clibuf) { obj_t *obj; pgp_t *pgp; @@ -2066,8 +2066,8 @@ static int tmemc_flush_mem(cli_id_t cli_id, uint32_t kb) */ #define BSIZE 1024 -static int tmemc_list_client(client_t *c, tmem_cli_va_t buf, int off, - uint32_t len, bool_t use_long) +static int tmemc_list_client(client_t *c, tmem_cli_va_param_t buf, + int off, uint32_t len, bool_t use_long) { char info[BSIZE]; int i, n = 0, sum = 0; @@ -2119,7 +2119,7 @@ static int tmemc_list_client(client_t *c, tmem_cli_va_t buf, int off, return sum; } -static int tmemc_list_shared(tmem_cli_va_t buf, int off, uint32_t len, +static int tmemc_list_shared(tmem_cli_va_param_t buf, int off, uint32_t len, bool_t use_long) { char info[BSIZE]; @@ -2159,8 +2159,8 @@ static int tmemc_list_shared(tmem_cli_va_t buf, int off, uint32_t len, } #ifdef TMEM_PERF -static int tmemc_list_global_perf(tmem_cli_va_t buf, int off, uint32_t len, - bool_t use_long) +static int tmemc_list_global_perf(tmem_cli_va_param_t buf, int off, + uint32_t len, bool_t use_long) { char info[BSIZE]; int n = 0, sum = 0; @@ -2194,7 +2194,7 @@ static int tmemc_list_global_perf(tmem_cli_va_t buf, int off, uint32_t len, #define tmemc_list_global_perf(_buf,_off,_len,_use) (0) #endif -static int tmemc_list_global(tmem_cli_va_t buf, int off, uint32_t len, +static int tmemc_list_global(tmem_cli_va_param_t buf, int off, uint32_t len, bool_t use_long) { char info[BSIZE]; @@ -2226,7 +2226,7 @@ static int tmemc_list_global(tmem_cli_va_t buf, int off, uint32_t len, return sum; } -static int tmemc_list(cli_id_t cli_id, tmem_cli_va_t buf, uint32_t len, +static int tmemc_list(cli_id_t cli_id, tmem_cli_va_param_t buf, uint32_t len, bool_t use_long) { client_t *client; @@ -2338,7 +2338,7 @@ static NOINLINE int tmemc_shared_pool_auth(cli_id_t cli_id, uint64_t uuid_lo, } static NOINLINE int tmemc_save_subop(int cli_id, uint32_t pool_id, - uint32_t subop, tmem_cli_va_t buf, uint32_t arg1) + uint32_t subop, tmem_cli_va_param_t buf, uint32_t arg1) { client_t *client = tmh_client_from_cli_id(cli_id); pool_t *pool = (client == NULL || pool_id >= MAX_POOLS_PER_DOMAIN) @@ -2427,7 +2427,7 @@ static NOINLINE int tmemc_save_subop(int cli_id, uint32_t pool_id, } static NOINLINE int tmemc_save_get_next_page(int cli_id, uint32_t pool_id, - tmem_cli_va_t buf, uint32_t bufsize) + tmem_cli_va_param_t buf, uint32_t bufsize) { client_t *client = tmh_client_from_cli_id(cli_id); pool_t *pool = (client == NULL || pool_id >= MAX_POOLS_PER_DOMAIN) @@ -2479,7 +2479,7 @@ out: return ret; } -static NOINLINE int tmemc_save_get_next_inv(int cli_id, tmem_cli_va_t buf, +static NOINLINE int tmemc_save_get_next_inv(int cli_id, tmem_cli_va_param_t buf, uint32_t bufsize) { client_t *client = tmh_client_from_cli_id(cli_id); @@ -2522,7 +2522,7 @@ out: } static int tmemc_restore_put_page(int cli_id, uint32_t pool_id, OID *oidp, - uint32_t index, tmem_cli_va_t buf, uint32_t bufsize) + uint32_t index, tmem_cli_va_param_t buf, uint32_t bufsize) { client_t *client = tmh_client_from_cli_id(cli_id); pool_t *pool = (client == NULL || pool_id >= MAX_POOLS_PER_DOMAIN) @@ -2566,7 +2566,8 @@ static NOINLINE int do_tmem_control(struct tmem_op *op) ret = tmemc_flush_mem(op->u.ctrl.cli_id,op->u.ctrl.arg1); break; case TMEMC_LIST: - ret = tmemc_list(op->u.ctrl.cli_id,op->u.ctrl.buf, + ret = tmemc_list(op->u.ctrl.cli_id, + guest_handle_cast(op->u.ctrl.buf, char), op->u.ctrl.arg1,op->u.ctrl.arg2); break; case TMEMC_SET_WEIGHT: @@ -2589,20 +2590,24 @@ static NOINLINE int do_tmem_control(struct tmem_op *op) case TMEMC_SAVE_GET_POOL_UUID: case TMEMC_SAVE_END: ret = tmemc_save_subop(op->u.ctrl.cli_id,pool_id,subop, - op->u.ctrl.buf,op->u.ctrl.arg1); + guest_handle_cast(op->u.ctrl.buf, char), + op->u.ctrl.arg1); break; case TMEMC_SAVE_GET_NEXT_PAGE: ret = tmemc_save_get_next_page(op->u.ctrl.cli_id, pool_id, - op->u.ctrl.buf, op->u.ctrl.arg1); + guest_handle_cast(op->u.ctrl.buf, char), + op->u.ctrl.arg1); break; case TMEMC_SAVE_GET_NEXT_INV: - ret = tmemc_save_get_next_inv(op->u.ctrl.cli_id, op->u.ctrl.buf, + ret = tmemc_save_get_next_inv(op->u.ctrl.cli_id, + guest_handle_cast(op->u.ctrl.buf, char), op->u.ctrl.arg1); break; case TMEMC_RESTORE_PUT_PAGE: ret = tmemc_restore_put_page(op->u.ctrl.cli_id,pool_id, oidp, op->u.ctrl.arg2, - op->u.ctrl.buf, op->u.ctrl.arg1); + guest_handle_cast(op->u.ctrl.buf, char), + op->u.ctrl.arg1); break; case TMEMC_RESTORE_FLUSH_PAGE: ret = tmemc_restore_flush_page(op->u.ctrl.cli_id,pool_id, diff --git a/xen/common/tmem_xen.c b/xen/common/tmem_xen.c index 9dc2a1d..25fbd6c 100644 --- a/xen/common/tmem_xen.c +++ b/xen/common/tmem_xen.c @@ -146,7 +146,7 @@ static inline void cli_put_page(void *cli_va, pfp_t *cli_pfp, EXPORT int tmh_copy_from_client(pfp_t *pfp, tmem_cli_mfn_t cmfn, pagesize_t tmem_offset, - pagesize_t pfn_offset, pagesize_t len, tmem_cli_va_t clibuf) + pagesize_t pfn_offset, pagesize_t len, tmem_cli_va_param_t clibuf) { unsigned long tmem_mfn, cli_mfn = 0; char *tmem_va, *cli_va = NULL; @@ -194,7 +194,7 @@ EXPORT int tmh_copy_from_client(pfp_t *pfp, } EXPORT int tmh_compress_from_client(tmem_cli_mfn_t cmfn, - void **out_va, size_t *out_len, tmem_cli_va_t clibuf) + void **out_va, size_t *out_len, tmem_cli_va_param_t clibuf) { int ret = 0; unsigned char *dmem = this_cpu(dstmem); @@ -227,7 +227,7 @@ EXPORT int tmh_compress_from_client(tmem_cli_mfn_t cmfn, EXPORT int tmh_copy_to_client(tmem_cli_mfn_t cmfn, pfp_t *pfp, pagesize_t tmem_offset, pagesize_t pfn_offset, pagesize_t len, - tmem_cli_va_t clibuf) + tmem_cli_va_param_t clibuf) { unsigned long tmem_mfn, cli_mfn = 0; char *tmem_va, *cli_va = NULL; @@ -265,7 +265,7 @@ EXPORT int tmh_copy_to_client(tmem_cli_mfn_t cmfn, pfp_t *pfp, } EXPORT int tmh_decompress_to_client(tmem_cli_mfn_t cmfn, void *tmem_va, - size_t size, tmem_cli_va_t clibuf) + size_t size, tmem_cli_va_param_t clibuf) { unsigned long cli_mfn = 0; pfp_t *cli_pfp = NULL; diff --git a/xen/common/xenoprof.c b/xen/common/xenoprof.c index 44a1fae..ae0435b 100644 --- a/xen/common/xenoprof.c +++ b/xen/common/xenoprof.c @@ -404,7 +404,7 @@ static int add_active_list(domid_t domid) return 0; } -static int add_passive_list(XEN_GUEST_HANDLE(void) arg) +static int add_passive_list(XEN_GUEST_HANDLE_PARAM(void) arg) { struct xenoprof_passive passive; struct domain *d; @@ -585,7 +585,7 @@ void xenoprof_log_event(struct vcpu *vcpu, const struct cpu_user_regs *regs, -static int xenoprof_op_init(XEN_GUEST_HANDLE(void) arg) +static int xenoprof_op_init(XEN_GUEST_HANDLE_PARAM(void) arg) { struct domain *d = current->domain; struct xenoprof_init xenoprof_init; @@ -611,7 +611,7 @@ static int xenoprof_op_init(XEN_GUEST_HANDLE(void) arg) #endif /* !COMPAT */ -static int xenoprof_op_get_buffer(XEN_GUEST_HANDLE(void) arg) +static int xenoprof_op_get_buffer(XEN_GUEST_HANDLE_PARAM(void) arg) { struct xenoprof_get_buffer xenoprof_get_buffer; struct domain *d = current->domain; @@ -662,7 +662,7 @@ static int xenoprof_op_get_buffer(XEN_GUEST_HANDLE(void) arg) || (op == XENOPROF_disable_virq) \ || (op == XENOPROF_get_buffer)) -ret_t do_xenoprof_op(int op, XEN_GUEST_HANDLE(void) arg) +ret_t do_xenoprof_op(int op, XEN_GUEST_HANDLE_PARAM(void) arg) { int ret = 0; diff --git a/xen/drivers/acpi/pmstat.c b/xen/drivers/acpi/pmstat.c index 6f266ef..bf30cc7 100644 --- a/xen/drivers/acpi/pmstat.c +++ b/xen/drivers/acpi/pmstat.c @@ -496,7 +496,7 @@ int do_pm_op(struct xen_sysctl_pm_op *op) return ret; } -int acpi_set_pdc_bits(u32 acpi_id, XEN_GUEST_HANDLE(uint32) pdc) +int acpi_set_pdc_bits(u32 acpi_id, XEN_GUEST_HANDLE_PARAM(uint32) pdc) { u32 bits[3]; int ret; diff --git a/xen/drivers/char/console.c b/xen/drivers/char/console.c index 9e1adb5..ff360fe 100644 --- a/xen/drivers/char/console.c +++ b/xen/drivers/char/console.c @@ -182,7 +182,7 @@ static void putchar_console_ring(int c) long read_console_ring(struct xen_sysctl_readconsole *op) { - XEN_GUEST_HANDLE(char) str; + XEN_GUEST_HANDLE_PARAM(char) str; uint32_t idx, len, max, sofar, c; str = guest_handle_cast(op->buffer, char), @@ -363,7 +363,7 @@ static void notify_dom0_con_ring(unsigned long unused) static DECLARE_SOFTIRQ_TASKLET(notify_dom0_con_ring_tasklet, notify_dom0_con_ring, 0); -static long guest_console_write(XEN_GUEST_HANDLE(char) buffer, int count) +static long guest_console_write(XEN_GUEST_HANDLE_PARAM(char) buffer, int count) { char kbuf[128], *kptr; int kcount; @@ -401,7 +401,7 @@ static long guest_console_write(XEN_GUEST_HANDLE(char) buffer, int count) return 0; } -long do_console_io(int cmd, int count, XEN_GUEST_HANDLE(char) buffer) +long do_console_io(int cmd, int count, XEN_GUEST_HANDLE_PARAM(char) buffer) { long rc; unsigned int idx, len; diff --git a/xen/drivers/passthrough/iommu.c b/xen/drivers/passthrough/iommu.c index b4cf16c..4b5f8b7 100644 --- a/xen/drivers/passthrough/iommu.c +++ b/xen/drivers/passthrough/iommu.c @@ -527,7 +527,7 @@ void iommu_crash_shutdown(void) int iommu_do_domctl( struct xen_domctl *domctl, - XEN_GUEST_HANDLE(xen_domctl_t) u_domctl) + XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl) { struct domain *d; u16 seg; diff --git a/xen/include/asm-arm/hypercall.h b/xen/include/asm-arm/hypercall.h index 454f02e..090e620 100644 --- a/xen/include/asm-arm/hypercall.h +++ b/xen/include/asm-arm/hypercall.h @@ -2,7 +2,7 @@ #define __ASM_ARM_HYPERCALL_H__ #include <public/domctl.h> /* for arch_do_domctl */ -int do_physdev_op(int cmd, XEN_GUEST_HANDLE(void) arg); +int do_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg); #endif /* __ASM_ARM_HYPERCALL_H__ */ /* diff --git a/xen/include/asm-arm/mm.h b/xen/include/asm-arm/mm.h index e4b2d97..c0f5b1f 100644 --- a/xen/include/asm-arm/mm.h +++ b/xen/include/asm-arm/mm.h @@ -267,7 +267,7 @@ static inline int relinquish_shared_pages(struct domain *d) /* Arch-specific portion of memory_op hypercall. */ -long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg); +long arch_memory_op(int op, XEN_GUEST_HANDLE_PARAM(void) arg); int steal_page( struct domain *d, struct page_info *page, unsigned int memflags); diff --git a/xen/include/asm-x86/hap.h b/xen/include/asm-x86/hap.h index a2532a4..916a35b 100644 --- a/xen/include/asm-x86/hap.h +++ b/xen/include/asm-x86/hap.h @@ -51,7 +51,7 @@ hap_unmap_domain_page(void *p) /************************************************/ void hap_domain_init(struct domain *d); int hap_domctl(struct domain *d, xen_domctl_shadow_op_t *sc, - XEN_GUEST_HANDLE(void) u_domctl); + XEN_GUEST_HANDLE_PARAM(void) u_domctl); int hap_enable(struct domain *d, u32 mode); void hap_final_teardown(struct domain *d); void hap_teardown(struct domain *d); diff --git a/xen/include/asm-x86/hypercall.h b/xen/include/asm-x86/hypercall.h index a9af426..bd14220 100644 --- a/xen/include/asm-x86/hypercall.h +++ b/xen/include/asm-x86/hypercall.h @@ -18,22 +18,22 @@ extern long do_event_channel_op_compat( - XEN_GUEST_HANDLE(evtchn_op_t) uop); + XEN_GUEST_HANDLE_PARAM(evtchn_op_t) uop); extern long do_set_trap_table( - XEN_GUEST_HANDLE(const_trap_info_t) traps); + XEN_GUEST_HANDLE_PARAM(const_trap_info_t) traps); extern long do_mmu_update( - XEN_GUEST_HANDLE(mmu_update_t) ureqs, + XEN_GUEST_HANDLE_PARAM(mmu_update_t) ureqs, unsigned int count, - XEN_GUEST_HANDLE(uint) pdone, + XEN_GUEST_HANDLE_PARAM(uint) pdone, unsigned int foreigndom); extern long do_set_gdt( - XEN_GUEST_HANDLE(ulong) frame_list, + XEN_GUEST_HANDLE_PARAM(ulong) frame_list, unsigned int entries); extern long @@ -60,7 +60,7 @@ do_update_descriptor( u64 desc); extern long -do_mca(XEN_GUEST_HANDLE(xen_mc_t) u_xen_mc); +do_mca(XEN_GUEST_HANDLE_PARAM(xen_mc_t) u_xen_mc); extern long do_update_va_mapping( @@ -70,7 +70,7 @@ do_update_va_mapping( extern long do_physdev_op( - int cmd, XEN_GUEST_HANDLE(void) arg); + int cmd, XEN_GUEST_HANDLE_PARAM(void) arg); extern long do_update_va_mapping_otherdomain( @@ -81,9 +81,9 @@ do_update_va_mapping_otherdomain( extern long do_mmuext_op( - XEN_GUEST_HANDLE(mmuext_op_t) uops, + XEN_GUEST_HANDLE_PARAM(mmuext_op_t) uops, unsigned int count, - XEN_GUEST_HANDLE(uint) pdone, + XEN_GUEST_HANDLE_PARAM(uint) pdone, unsigned int foreigndom); extern unsigned long @@ -104,10 +104,10 @@ do_set_segment_base( extern int compat_physdev_op( int cmd, - XEN_GUEST_HANDLE(void) arg); + XEN_GUEST_HANDLE_PARAM(void) arg); extern int arch_compat_vcpu_op( - int cmd, struct vcpu *v, XEN_GUEST_HANDLE(void) arg); + int cmd, struct vcpu *v, XEN_GUEST_HANDLE_PARAM(void) arg); #endif /* __ASM_X86_HYPERCALL_H__ */ diff --git a/xen/include/asm-x86/mem_event.h b/xen/include/asm-x86/mem_event.h index 23d71c1..e17f36b 100644 --- a/xen/include/asm-x86/mem_event.h +++ b/xen/include/asm-x86/mem_event.h @@ -65,7 +65,7 @@ int mem_event_get_response(struct domain *d, struct mem_event_domain *med, struct domain *get_mem_event_op_target(uint32_t domain, int *rc); int do_mem_event_op(int op, uint32_t domain, void *arg); int mem_event_domctl(struct domain *d, xen_domctl_mem_event_op_t *mec, - XEN_GUEST_HANDLE(void) u_domctl); + XEN_GUEST_HANDLE_PARAM(void) u_domctl); #endif /* __MEM_EVENT_H__ */ diff --git a/xen/include/asm-x86/mm.h b/xen/include/asm-x86/mm.h index 6e1e57c..494dad8 100644 --- a/xen/include/asm-x86/mm.h +++ b/xen/include/asm-x86/mm.h @@ -555,10 +555,10 @@ void *do_page_walk(struct vcpu *v, unsigned long addr); int __sync_local_execstate(void); /* Arch-specific portion of memory_op hypercall. */ -long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg); -long subarch_memory_op(int op, XEN_GUEST_HANDLE(void) arg); -int compat_arch_memory_op(int op, XEN_GUEST_HANDLE(void)); -int compat_subarch_memory_op(int op, XEN_GUEST_HANDLE(void)); +long arch_memory_op(int op, XEN_GUEST_HANDLE_PARAM(void) arg); +long subarch_memory_op(int op, XEN_GUEST_HANDLE_PARAM(void) arg); +int compat_arch_memory_op(int op, XEN_GUEST_HANDLE_PARAM(void)); +int compat_subarch_memory_op(int op, XEN_GUEST_HANDLE_PARAM(void)); int steal_page( struct domain *d, struct page_info *page, unsigned int memflags); diff --git a/xen/include/asm-x86/paging.h b/xen/include/asm-x86/paging.h index d9b6950..9a40f2c 100644 --- a/xen/include/asm-x86/paging.h +++ b/xen/include/asm-x86/paging.h @@ -207,7 +207,7 @@ int paging_domain_init(struct domain *d, unsigned int domcr_flags); * and disable ephemeral shadow modes (test mode and log-dirty mode) and * manipulate the log-dirty bitmap. */ int paging_domctl(struct domain *d, xen_domctl_shadow_op_t *sc, - XEN_GUEST_HANDLE(void) u_domctl); + XEN_GUEST_HANDLE_PARAM(void) u_domctl); /* Call when destroying a domain */ void paging_teardown(struct domain *d); diff --git a/xen/include/asm-x86/processor.h b/xen/include/asm-x86/processor.h index c969b11..637cea3 100644 --- a/xen/include/asm-x86/processor.h +++ b/xen/include/asm-x86/processor.h @@ -549,7 +549,7 @@ int rdmsr_hypervisor_regs(uint32_t idx, uint64_t *val); int wrmsr_hypervisor_regs(uint32_t idx, uint64_t val); void microcode_set_module(unsigned int); -int microcode_update(XEN_GUEST_HANDLE(const_void), unsigned long len); +int microcode_update(XEN_GUEST_HANDLE_PARAM(const_void), unsigned long len); int microcode_resume_cpu(int cpu); #endif /* !__ASSEMBLY__ */ diff --git a/xen/include/asm-x86/shadow.h b/xen/include/asm-x86/shadow.h index 88a8cd2..2eb6efc 100644 --- a/xen/include/asm-x86/shadow.h +++ b/xen/include/asm-x86/shadow.h @@ -73,7 +73,7 @@ int shadow_track_dirty_vram(struct domain *d, * manipulate the log-dirty bitmap. */ int shadow_domctl(struct domain *d, xen_domctl_shadow_op_t *sc, - XEN_GUEST_HANDLE(void) u_domctl); + XEN_GUEST_HANDLE_PARAM(void) u_domctl); /* Call when destroying a domain */ void shadow_teardown(struct domain *d); diff --git a/xen/include/asm-x86/xenoprof.h b/xen/include/asm-x86/xenoprof.h index a71f020..52a6881 100644 --- a/xen/include/asm-x86/xenoprof.h +++ b/xen/include/asm-x86/xenoprof.h @@ -40,9 +40,9 @@ int xenoprof_arch_init(int *num_events, char *cpu_type); #define xenoprof_arch_disable_virq() nmi_disable_virq() #define xenoprof_arch_release_counters() nmi_release_counters() -int xenoprof_arch_counter(XEN_GUEST_HANDLE(void) arg); -int compat_oprof_arch_counter(XEN_GUEST_HANDLE(void) arg); -int xenoprof_arch_ibs_counter(XEN_GUEST_HANDLE(void) arg); +int xenoprof_arch_counter(XEN_GUEST_HANDLE_PARAM(void) arg); +int compat_oprof_arch_counter(XEN_GUEST_HANDLE_PARAM(void) arg); +int xenoprof_arch_ibs_counter(XEN_GUEST_HANDLE_PARAM(void) arg); struct vcpu; struct cpu_user_regs; diff --git a/xen/include/xen/acpi.h b/xen/include/xen/acpi.h index d7e2f94..8f3cdca 100644 --- a/xen/include/xen/acpi.h +++ b/xen/include/xen/acpi.h @@ -145,8 +145,8 @@ static inline unsigned int acpi_get_cstate_limit(void) { return 0; } static inline void acpi_set_cstate_limit(unsigned int new_limit) { return; } #endif -#ifdef XEN_GUEST_HANDLE -int acpi_set_pdc_bits(u32 acpi_id, XEN_GUEST_HANDLE(uint32)); +#ifdef XEN_GUEST_HANDLE_PARAM +int acpi_set_pdc_bits(u32 acpi_id, XEN_GUEST_HANDLE_PARAM(uint32)); #endif int arch_acpi_set_pdc_bits(u32 acpi_id, u32 *, u32 mask); diff --git a/xen/include/xen/compat.h b/xen/include/xen/compat.h index 857cbc7..ca60699 100644 --- a/xen/include/xen/compat.h +++ b/xen/include/xen/compat.h @@ -22,6 +22,9 @@ __DEFINE_COMPAT_HANDLE(const_ ## name, const name) #define COMPAT_HANDLE(name) __compat_handle_ ## name +/* NB: it is assumed that if an arch uses the compat layer it does not + * distinguish handles from parameter handles. */ +#define COMPAT_HANDLE_PARAM(name) __compat_handle_ ## name /* Is the compat handle a NULL reference? */ #define compat_handle_is_null(hnd) ((hnd).c == 0) diff --git a/xen/include/xen/hypercall.h b/xen/include/xen/hypercall.h index 1b71071..e315523 100644 --- a/xen/include/xen/hypercall.h +++ b/xen/include/xen/hypercall.h @@ -29,29 +29,29 @@ do_sched_op_compat( extern long do_sched_op( int cmd, - XEN_GUEST_HANDLE(void) arg); + XEN_GUEST_HANDLE_PARAM(void) arg); extern long do_domctl( - XEN_GUEST_HANDLE(xen_domctl_t) u_domctl); + XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl); extern long arch_do_domctl( struct xen_domctl *domctl, - XEN_GUEST_HANDLE(xen_domctl_t) u_domctl); + XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl); extern long do_sysctl( - XEN_GUEST_HANDLE(xen_sysctl_t) u_sysctl); + XEN_GUEST_HANDLE_PARAM(xen_sysctl_t) u_sysctl); extern long arch_do_sysctl( struct xen_sysctl *sysctl, - XEN_GUEST_HANDLE(xen_sysctl_t) u_sysctl); + XEN_GUEST_HANDLE_PARAM(xen_sysctl_t) u_sysctl); extern long do_platform_op( - XEN_GUEST_HANDLE(xen_platform_op_t) u_xenpf_op); + XEN_GUEST_HANDLE_PARAM(xen_platform_op_t) u_xenpf_op); /* * To allow safe resume of do_memory_op() after preemption, we need to know @@ -64,11 +64,11 @@ do_platform_op( extern long do_memory_op( unsigned long cmd, - XEN_GUEST_HANDLE(void) arg); + XEN_GUEST_HANDLE_PARAM(void) arg); extern long do_multicall( - XEN_GUEST_HANDLE(multicall_entry_t) call_list, + XEN_GUEST_HANDLE_PARAM(multicall_entry_t) call_list, unsigned int nr_calls); extern long @@ -77,23 +77,23 @@ do_set_timer_op( extern long do_event_channel_op( - int cmd, XEN_GUEST_HANDLE(void) arg); + int cmd, XEN_GUEST_HANDLE_PARAM(void) arg); extern long do_xen_version( int cmd, - XEN_GUEST_HANDLE(void) arg); + XEN_GUEST_HANDLE_PARAM(void) arg); extern long do_console_io( int cmd, int count, - XEN_GUEST_HANDLE(char) buffer); + XEN_GUEST_HANDLE_PARAM(char) buffer); extern long do_grant_table_op( unsigned int cmd, - XEN_GUEST_HANDLE(void) uop, + XEN_GUEST_HANDLE_PARAM(void) uop, unsigned int count); extern long @@ -105,72 +105,72 @@ extern long do_vcpu_op( int cmd, int vcpuid, - XEN_GUEST_HANDLE(void) arg); + XEN_GUEST_HANDLE_PARAM(void) arg); struct vcpu; extern long arch_do_vcpu_op(int cmd, struct vcpu *v, - XEN_GUEST_HANDLE(void) arg); + XEN_GUEST_HANDLE_PARAM(void) arg); extern long do_nmi_op( unsigned int cmd, - XEN_GUEST_HANDLE(void) arg); + XEN_GUEST_HANDLE_PARAM(void) arg); extern long do_hvm_op( unsigned long op, - XEN_GUEST_HANDLE(void) arg); + XEN_GUEST_HANDLE_PARAM(void) arg); extern long do_kexec_op( unsigned long op, int arg1, - XEN_GUEST_HANDLE(void) arg); + XEN_GUEST_HANDLE_PARAM(void) arg); extern long do_xsm_op( - XEN_GUEST_HANDLE(xsm_op_t) u_xsm_op); + XEN_GUEST_HANDLE_PARAM(xsm_op_t) u_xsm_op); extern long do_tmem_op( - XEN_GUEST_HANDLE(tmem_op_t) uops); + XEN_GUEST_HANDLE_PARAM(tmem_op_t) uops); extern long -do_xenoprof_op(int op, XEN_GUEST_HANDLE(void) arg); +do_xenoprof_op(int op, XEN_GUEST_HANDLE_PARAM(void) arg); #ifdef CONFIG_COMPAT extern int compat_memory_op( unsigned int cmd, - XEN_GUEST_HANDLE(void) arg); + XEN_GUEST_HANDLE_PARAM(void) arg); extern int compat_grant_table_op( unsigned int cmd, - XEN_GUEST_HANDLE(void) uop, + XEN_GUEST_HANDLE_PARAM(void) uop, unsigned int count); extern int compat_vcpu_op( int cmd, int vcpuid, - XEN_GUEST_HANDLE(void) arg); + XEN_GUEST_HANDLE_PARAM(void) arg); extern int -compat_xenoprof_op(int op, XEN_GUEST_HANDLE(void) arg); +compat_xenoprof_op(int op, XEN_GUEST_HANDLE_PARAM(void) arg); extern int compat_xen_version( int cmd, - XEN_GUEST_HANDLE(void) arg); + XEN_GUEST_HANDLE_PARAM(void) arg); extern int compat_sched_op( int cmd, - XEN_GUEST_HANDLE(void) arg); + XEN_GUEST_HANDLE_PARAM(void) arg); extern int compat_set_timer_op( diff --git a/xen/include/xen/iommu.h b/xen/include/xen/iommu.h index 605c7b3..773a6d7 100644 --- a/xen/include/xen/iommu.h +++ b/xen/include/xen/iommu.h @@ -156,7 +156,7 @@ void iommu_crash_shutdown(void); void iommu_set_dom0_mapping(struct domain *d); void iommu_share_p2m_table(struct domain *d); -int iommu_do_domctl(struct xen_domctl *, XEN_GUEST_HANDLE(xen_domctl_t)); +int iommu_do_domctl(struct xen_domctl *, XEN_GUEST_HANDLE_PARAM(xen_domctl_t)); void iommu_iotlb_flush(struct domain *d, unsigned long gfn, unsigned int page_count); void iommu_iotlb_flush_all(struct domain *d); diff --git a/xen/include/xen/tmem_xen.h b/xen/include/xen/tmem_xen.h index 9492810..36a8d9f 100644 --- a/xen/include/xen/tmem_xen.h +++ b/xen/include/xen/tmem_xen.h @@ -430,7 +430,8 @@ static inline void tmh_tze_copy_from_pfp(void *tva, pfp_t *pfp, pagesize_t len) typedef XEN_GUEST_HANDLE(void) cli_mfn_t; typedef XEN_GUEST_HANDLE(char) cli_va_t; */ -typedef XEN_GUEST_HANDLE(tmem_op_t) tmem_cli_op_t; +typedef XEN_GUEST_HANDLE_PARAM(tmem_op_t) tmem_cli_op_t; +typedef XEN_GUEST_HANDLE_PARAM(char) tmem_cli_va_param_t; static inline int tmh_get_tmemop_from_client(tmem_op_t *op, tmem_cli_op_t uops) { @@ -466,8 +467,9 @@ static inline int tmh_get_tmemop_from_client(tmem_op_t *op, tmem_cli_op_t uops) #define tmh_cli_buf_null guest_handle_from_ptr(NULL, char) -static inline void tmh_copy_to_client_buf_offset(tmem_cli_va_t clibuf, int off, - char *tmembuf, int len) +static inline void tmh_copy_to_client_buf_offset(tmem_cli_va_param_t clibuf, + int off, + char *tmembuf, int len) { copy_to_guest_offset(clibuf,off,tmembuf,len); } @@ -482,15 +484,17 @@ static inline void tmh_copy_to_client_buf_offset(tmem_cli_va_t clibuf, int off, #define tmh_cli_id_str "domid" #define tmh_client_str "domain" -int tmh_decompress_to_client(tmem_cli_mfn_t, void *, size_t, tmem_cli_va_t); +int tmh_decompress_to_client(tmem_cli_mfn_t, void *, size_t, + tmem_cli_va_param_t); -int tmh_compress_from_client(tmem_cli_mfn_t, void **, size_t *, tmem_cli_va_t); +int tmh_compress_from_client(tmem_cli_mfn_t, void **, size_t *, + tmem_cli_va_param_t); int tmh_copy_from_client(pfp_t *, tmem_cli_mfn_t, pagesize_t tmem_offset, - pagesize_t pfn_offset, pagesize_t len, tmem_cli_va_t); + pagesize_t pfn_offset, pagesize_t len, tmem_cli_va_param_t); int tmh_copy_to_client(tmem_cli_mfn_t, pfp_t *, pagesize_t tmem_offset, - pagesize_t pfn_offset, pagesize_t len, tmem_cli_va_t); + pagesize_t pfn_offset, pagesize_t len, tmem_cli_va_param_t); extern int tmh_copy_tze_to_client(tmem_cli_mfn_t cmfn, void *tmem_va, pagesize_t len); diff --git a/xen/include/xsm/xsm.h b/xen/include/xsm/xsm.h index 593cdbd..a949c1e 100644 --- a/xen/include/xsm/xsm.h +++ b/xen/include/xsm/xsm.h @@ -139,7 +139,7 @@ struct xsm_operations { int (*cpupool_op)(void); int (*sched_op)(void); - long (*__do_xsm_op) (XEN_GUEST_HANDLE(xsm_op_t) op); + long (*__do_xsm_op) (XEN_GUEST_HANDLE_PARAM(xsm_op_t) op); #ifdef CONFIG_X86 int (*shadow_control) (struct domain *d, uint32_t op); @@ -585,7 +585,7 @@ static inline int xsm_sched_op(void) return xsm_call(sched_op()); } -static inline long __do_xsm_op (XEN_GUEST_HANDLE(xsm_op_t) op) +static inline long __do_xsm_op (XEN_GUEST_HANDLE_PARAM(xsm_op_t) op) { #ifdef XSM_ENABLE return xsm_ops->__do_xsm_op(op); diff --git a/xen/xsm/dummy.c b/xen/xsm/dummy.c index 4836fc0..b726eaf 100644 --- a/xen/xsm/dummy.c +++ b/xen/xsm/dummy.c @@ -380,7 +380,7 @@ static int dummy_sched_op (void) return 0; } -static long dummy___do_xsm_op(XEN_GUEST_HANDLE(xsm_op_t) op) +static long dummy___do_xsm_op(XEN_GUEST_HANDLE_PARAM(xsm_op_t) op) { return -ENOSYS; } diff --git a/xen/xsm/flask/flask_op.c b/xen/xsm/flask/flask_op.c index 9c8dfe7..a5d7748 100644 --- a/xen/xsm/flask/flask_op.c +++ b/xen/xsm/flask/flask_op.c @@ -71,7 +71,7 @@ static int domain_has_security(struct domain *d, u32 perms) perms, NULL); } -static int flask_copyin_string(XEN_GUEST_HANDLE(char) u_buf, char **buf, uint32_t size) +static int flask_copyin_string(XEN_GUEST_HANDLE_PARAM(char) u_buf, char **buf, uint32_t size) { char *tmp = xmalloc_bytes(size + 1); if ( !tmp ) @@ -618,7 +618,7 @@ static int flask_relabel_domain(struct xen_flask_relabel *arg) return rc; } -long do_flask_op(XEN_GUEST_HANDLE(xsm_op_t) u_flask_op) +long do_flask_op(XEN_GUEST_HANDLE_PARAM(xsm_op_t) u_flask_op) { xen_flask_op_t op; int rv; diff --git a/xen/xsm/flask/hooks.c b/xen/xsm/flask/hooks.c index 88fef9c..0ca10d0 100644 --- a/xen/xsm/flask/hooks.c +++ b/xen/xsm/flask/hooks.c @@ -1462,7 +1462,7 @@ static int flask_vcpuextstate (struct domain *d, uint32_t cmd) } #endif -long do_flask_op(XEN_GUEST_HANDLE(xsm_op_t) u_flask_op); +long do_flask_op(XEN_GUEST_HANDLE_PARAM(xsm_op_t) u_flask_op); static struct xsm_operations flask_ops = { .security_domaininfo = flask_security_domaininfo, diff --git a/xen/xsm/xsm_core.c b/xen/xsm/xsm_core.c index 96c8669..46287cb 100644 --- a/xen/xsm/xsm_core.c +++ b/xen/xsm/xsm_core.c @@ -111,7 +111,7 @@ int unregister_xsm(struct xsm_operations *ops) #endif -long do_xsm_op (XEN_GUEST_HANDLE(xsm_op_t) op) +long do_xsm_op (XEN_GUEST_HANDLE_PARAM(xsm_op_t) op) { return __do_xsm_op(op); } -- 1.7.9.1
Ian Campbell
2012-Oct-15 15:20 UTC
[PATCH 08/10] xen: more XEN_GUEST_HANDLE_PARAM substitutions
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com> More substitutions in this patch, not as obvious as the ones in the previous patch. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Signed-off-by: Ian Campbell <ian.campbell@citrix.com> Cc: keir@xen.org Cc: JBeulich@suse.com --- ijc v2: - Avoid _t suffix on variable names, use _param instead. --- xen/arch/x86/mm.c | 12 +++++++++--- xen/arch/x86/oprofile/backtrace.c | 5 ++++- xen/arch/x86/platform_hypercall.c | 10 +++++++--- xen/arch/x86/x86_64/cpu_idle.c | 4 +++- xen/arch/x86/x86_64/cpufreq.c | 4 +++- xen/arch/x86/x86_64/platform_hypercall.c | 1 + xen/common/compat/multicall.c | 1 + xen/common/multicall.c | 2 +- 8 files changed, 29 insertions(+), 10 deletions(-) diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index 9a828de..191f5ea 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -2913,7 +2913,9 @@ long do_mmuext_op( { cpumask_t pmask; - if ( unlikely(vcpumask_to_pcpumask(d, op.arg2.vcpumask, &pmask)) ) + if ( unlikely(vcpumask_to_pcpumask(d, + guest_handle_to_param(op.arg2.vcpumask, const_void), + &pmask)) ) { okay = 0; break; @@ -4195,6 +4197,7 @@ static int handle_iomem_range(unsigned long s, unsigned long e, void *p) if ( s > ctxt->s ) { e820entry_t ent; + XEN_GUEST_HANDLE_PARAM(e820entry_t) buffer_param; XEN_GUEST_HANDLE(e820entry_t) buffer; if ( ctxt->n + 1 >= ctxt->map.nr_entries ) @@ -4202,7 +4205,8 @@ static int handle_iomem_range(unsigned long s, unsigned long e, void *p) ent.addr = (uint64_t)ctxt->s << PAGE_SHIFT; ent.size = (uint64_t)(s - ctxt->s) << PAGE_SHIFT; ent.type = E820_RESERVED; - buffer = guest_handle_cast(ctxt->map.buffer, e820entry_t); + buffer_param = guest_handle_cast(ctxt->map.buffer, e820entry_t); + buffer = guest_handle_from_param(buffer_param, e820entry_t); if ( __copy_to_guest_offset(buffer, ctxt->n, &ent, 1) ) return -EFAULT; ctxt->n++; @@ -4499,6 +4503,7 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE_PARAM(void) arg) { struct memory_map_context ctxt; XEN_GUEST_HANDLE(e820entry_t) buffer; + XEN_GUEST_HANDLE_PARAM(e820entry_t) buffer_param; unsigned int i; if ( !IS_PRIV(current->domain) ) @@ -4513,7 +4518,8 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE_PARAM(void) arg) if ( ctxt.map.nr_entries < e820.nr_map + 1 ) return -EINVAL; - buffer = guest_handle_cast(ctxt.map.buffer, e820entry_t); + buffer_param = guest_handle_cast(ctxt.map.buffer, e820entry_t); + buffer = guest_handle_from_param(buffer_param, e820entry_t); if ( !guest_handle_okay(buffer, ctxt.map.nr_entries) ) return -EFAULT; diff --git a/xen/arch/x86/oprofile/backtrace.c b/xen/arch/x86/oprofile/backtrace.c index 433f881..b3ea7f3 100644 --- a/xen/arch/x86/oprofile/backtrace.c +++ b/xen/arch/x86/oprofile/backtrace.c @@ -74,8 +74,11 @@ dump_guest_backtrace(struct vcpu *vcpu, const struct frame_head *head, } else { - XEN_GUEST_HANDLE(const_frame_head_t) guest_head + XEN_GUEST_HANDLE(const_frame_head_t) guest_head; + XEN_GUEST_HANDLE_PARAM(const_frame_head_t) guest_head_param const_guest_handle_from_ptr(head, frame_head_t); + guest_head = guest_handle_from_param(guest_head_param, + const_frame_head_t); /* Also check accessibility of one struct frame_head beyond */ if (!guest_handle_okay(guest_head, 2)) diff --git a/xen/arch/x86/platform_hypercall.c b/xen/arch/x86/platform_hypercall.c index 073a2ea..a3b5a6b 100644 --- a/xen/arch/x86/platform_hypercall.c +++ b/xen/arch/x86/platform_hypercall.c @@ -61,7 +61,7 @@ long cpu_down_helper(void *data); long core_parking_helper(void *data); uint32_t get_cur_idle_nums(void); -ret_t do_platform_op(XEN_GUEST_HANDLE(xen_platform_op_t) u_xenpf_op) +ret_t do_platform_op(XEN_GUEST_HANDLE_PARAM(xen_platform_op_t) u_xenpf_op) { ret_t ret = 0; struct xen_platform_op curop, *op = &curop; @@ -186,7 +186,9 @@ ret_t do_platform_op(XEN_GUEST_HANDLE(xen_platform_op_t) u_xenpf_op) } } - ret = microcode_update(data, op->u.microcode.length); + ret = microcode_update( + guest_handle_to_param(data, const_void), + op->u.microcode.length); spin_unlock(&vcpu_alloc_lock); } break; @@ -454,7 +456,9 @@ ret_t do_platform_op(XEN_GUEST_HANDLE(xen_platform_op_t) u_xenpf_op) XEN_GUEST_HANDLE(uint32) pdc; guest_from_compat_handle(pdc, op->u.set_pminfo.u.pdc); - ret = acpi_set_pdc_bits(op->u.set_pminfo.id, pdc); + ret = acpi_set_pdc_bits( + op->u.set_pminfo.id, + guest_handle_to_param(pdc, uint32)); } break; diff --git a/xen/arch/x86/x86_64/cpu_idle.c b/xen/arch/x86/x86_64/cpu_idle.c index 3e7422f..dfc7e84 100644 --- a/xen/arch/x86/x86_64/cpu_idle.c +++ b/xen/arch/x86/x86_64/cpu_idle.c @@ -57,10 +57,12 @@ static int copy_from_compat_state(xen_processor_cx_t *xen_state, { #define XLAT_processor_cx_HNDL_dp(_d_, _s_) do { \ XEN_GUEST_HANDLE(compat_processor_csd_t) dps; \ + XEN_GUEST_HANDLE_PARAM(xen_processor_csd_t) dps_param; \ if ( unlikely(!compat_handle_okay((_s_)->dp, (_s_)->dpcnt)) ) \ return -EFAULT; \ guest_from_compat_handle(dps, (_s_)->dp); \ - (_d_)->dp = guest_handle_cast(dps, xen_processor_csd_t); \ + dps_param = guest_handle_cast(dps, xen_processor_csd_t); \ + (_d_)->dp = guest_handle_from_param(dps_param, xen_processor_csd_t); \ } while (0) XLAT_processor_cx(xen_state, state); #undef XLAT_processor_cx_HNDL_dp diff --git a/xen/arch/x86/x86_64/cpufreq.c b/xen/arch/x86/x86_64/cpufreq.c index ce9864e..1956777 100644 --- a/xen/arch/x86/x86_64/cpufreq.c +++ b/xen/arch/x86/x86_64/cpufreq.c @@ -45,10 +45,12 @@ compat_set_px_pminfo(uint32_t cpu, struct compat_processor_performance *perf) #define XLAT_processor_performance_HNDL_states(_d_, _s_) do { \ XEN_GUEST_HANDLE(compat_processor_px_t) states; \ + XEN_GUEST_HANDLE_PARAM(xen_processor_px_t) states_t; \ if ( unlikely(!compat_handle_okay((_s_)->states, (_s_)->state_count)) ) \ return -EFAULT; \ guest_from_compat_handle(states, (_s_)->states); \ - (_d_)->states = guest_handle_cast(states, xen_processor_px_t); \ + states_t = guest_handle_cast(states, xen_processor_px_t); \ + (_d_)->states = guest_handle_from_param(states_t, xen_processor_px_t); \ } while (0) XLAT_processor_performance(xen_perf, perf); diff --git a/xen/arch/x86/x86_64/platform_hypercall.c b/xen/arch/x86/x86_64/platform_hypercall.c index 188aa37..744796d 100644 --- a/xen/arch/x86/x86_64/platform_hypercall.c +++ b/xen/arch/x86/x86_64/platform_hypercall.c @@ -38,6 +38,7 @@ CHECK_pf_pcpu_version; #define COMPAT #define _XEN_GUEST_HANDLE(t) XEN_GUEST_HANDLE(t) +#define _XEN_GUEST_HANDLE_PARAM(t) XEN_GUEST_HANDLE_PARAM(t) typedef int ret_t; #include "../platform_hypercall.c" diff --git a/xen/common/compat/multicall.c b/xen/common/compat/multicall.c index e7e2a40..3219d3c 100644 --- a/xen/common/compat/multicall.c +++ b/xen/common/compat/multicall.c @@ -25,6 +25,7 @@ DEFINE_XEN_GUEST_HANDLE(multicall_entry_compat_t); #define call compat_call #define do_multicall(l, n) compat_multicall(_##l, n) #define _XEN_GUEST_HANDLE(t) XEN_GUEST_HANDLE(t) +#define _XEN_GUEST_HANDLE_PARAM(t) XEN_GUEST_HANDLE(t) static void __trace_multicall_call(multicall_entry_t *call) { diff --git a/xen/common/multicall.c b/xen/common/multicall.c index ca1839d..7e557e5 100644 --- a/xen/common/multicall.c +++ b/xen/common/multicall.c @@ -35,7 +35,7 @@ static void trace_multicall_call(multicall_entry_t *call) ret_t do_multicall( - XEN_GUEST_HANDLE(multicall_entry_t) call_list, unsigned int nr_calls) + XEN_GUEST_HANDLE_PARAM(multicall_entry_t) call_list, unsigned int nr_calls) { struct mc_state *mcs = ¤t->mc_state; unsigned int i; -- 1.7.9.1
Having both this handle (always unsigned long) and XEN_GUEST_HANDLE(xen_ulong_t) (unsigned long on x86 and explicit size of ARM) is confusing and error prone. Replace the two remaining uses of the ulong handle, in grant set and x86 set_gdt hypercalls, with xen_ulong_t. This correctly sizes the grant frame entry as 64 bit on ARM but leaves it as unsigned long on x86 (therefore no intended change on x86). Likewise in set_gdt there is no actual change. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> Cc: keir@xen.org Cc: JBeulich@suse.com --- xen/arch/x86/mm.c | 3 ++- xen/common/grant_table.c | 2 +- xen/include/asm-x86/hypercall.h | 2 +- xen/include/public/grant_table.h | 2 +- xen/include/public/xen.h | 2 -- 5 files changed, 5 insertions(+), 6 deletions(-) diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index 191f5ea..fad3d33 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -4100,7 +4100,8 @@ long set_gdt(struct vcpu *v, } -long do_set_gdt(XEN_GUEST_HANDLE_PARAM(ulong) frame_list, unsigned int entries) +long do_set_gdt(XEN_GUEST_HANDLE_PARAM(xen_ulong_t) frame_list, + unsigned int entries) { int nr_pages = (entries + 511) / 512; unsigned long frames[16]; diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c index f4ae9ee..7912769 100644 --- a/xen/common/grant_table.c +++ b/xen/common/grant_table.c @@ -1322,7 +1322,7 @@ gnttab_setup_table( struct domain *d; struct grant_table *gt; int i; - unsigned long gmfn; + xen_pfn_t gmfn; if ( count != 1 ) return -EINVAL; diff --git a/xen/include/asm-x86/hypercall.h b/xen/include/asm-x86/hypercall.h index bd14220..afa8ba9 100644 --- a/xen/include/asm-x86/hypercall.h +++ b/xen/include/asm-x86/hypercall.h @@ -33,7 +33,7 @@ do_mmu_update( extern long do_set_gdt( - XEN_GUEST_HANDLE_PARAM(ulong) frame_list, + XEN_GUEST_HANDLE_PARAM(xen_ulong_t) frame_list, unsigned int entries); extern long diff --git a/xen/include/public/grant_table.h b/xen/include/public/grant_table.h index 28d9476..13cc559 100644 --- a/xen/include/public/grant_table.h +++ b/xen/include/public/grant_table.h @@ -385,7 +385,7 @@ struct gnttab_setup_table { uint32_t nr_frames; /* OUT parameters. */ int16_t status; /* => enum grant_status */ - XEN_GUEST_HANDLE(ulong) frame_list; + XEN_GUEST_HANDLE(xen_pfn_t) frame_list; }; typedef struct gnttab_setup_table gnttab_setup_table_t; DEFINE_XEN_GUEST_HANDLE(gnttab_setup_table_t); diff --git a/xen/include/public/xen.h b/xen/include/public/xen.h index e42d01f..9a5b394 100644 --- a/xen/include/public/xen.h +++ b/xen/include/public/xen.h @@ -43,8 +43,6 @@ DEFINE_XEN_GUEST_HANDLE(char); __DEFINE_XEN_GUEST_HANDLE(uchar, unsigned char); DEFINE_XEN_GUEST_HANDLE(int); __DEFINE_XEN_GUEST_HANDLE(uint, unsigned int); -DEFINE_XEN_GUEST_HANDLE(long); -__DEFINE_XEN_GUEST_HANDLE(ulong, unsigned long); DEFINE_XEN_GUEST_HANDLE(void); DEFINE_XEN_GUEST_HANDLE(uint64_t); -- 1.7.9.1
Ian Campbell
2012-Oct-15 15:20 UTC
[PATCH 10/10] arm: parameter guest handles are 32 bit on 32 bit hypervisor
Handles within structs remain 64 bit such that they are consistently sized on both 32 and 64 bit. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> --- xen/include/public/arch-arm.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/xen/include/public/arch-arm.h b/xen/include/public/arch-arm.h index ac493a5..ff02d15 100644 --- a/xen/include/public/arch-arm.h +++ b/xen/include/public/arch-arm.h @@ -74,7 +74,7 @@ #define __XEN_GUEST_HANDLE(name) __guest_handle_64_ ## name #define XEN_GUEST_HANDLE(name) __XEN_GUEST_HANDLE(name) /* this is going to be changed on 64 bit */ -#define XEN_GUEST_HANDLE_PARAM(name) XEN_GUEST_HANDLE(name) +#define XEN_GUEST_HANDLE_PARAM(name) __guest_handle_ ## name #define set_xen_guest_handle_raw(hnd, val) \ do { \ typeof(&(hnd)) _sxghr_tmp = &(hnd); \ -- 1.7.9.1
Keir Fraser
2012-Oct-15 15:48 UTC
Re: [PATCH v2 00/10] 64 bit ARM ABI, map foreign gmfn API, ARM grant tables
On 15/10/2012 16:20, "Ian Campbell" <Ian.Campbell@citrix.com> wrote:> This is v2 of "Sweep through arm-for-4.3 branch + a bit extra" retitled > since most of the sweep through stuff has been swept through already and > just the bit extra remains. > > I''ve addressed the review comments and fixed the bisection issue. A > bunch of this stuff is cross arch and/or touches common code.Those bits are fine by me, now. Acked-by: Keir Fraser <keir@xen.org>> The Linux side of the 64 bit ARM ABI changes are in mainline Linux > already (just a few tweaks and cleanups remain). > > xen: arm: implement XENMEM_add_to_physmap_range > > New hypercall intended for use by both ARM (Linux patches exist) > and x86 PVH (TBD) > > xen/arm: grant table > > Simple wiring up job. Acked but depends on > XENMEM_add_to_physmap_range. > > arm: tools: add arm to foreign structs checking > > Fixes native tools build on ARM > > xen: xen_ulong_t substitution > xen: change the limit of nr_extents to UINT_MAX >> MEMOP_EXTENT_SHIFT > xen: introduce XEN_GUEST_HANDLE_PARAM > xen: replace XEN_GUEST_HANDLE with XEN_GUEST_HANDLE_PARAM when appropriate > xen: more XEN_GUEST_HANDLE_PARAM substitutions > xen: remove XEN_GUEST_HANDLE(ulong) > arm: parameter guest handles are 32 bit on 32 bit hypervisor > > These are the ARM 64 bit API, mostly from Stefano and posted > several times already. > > Ian. >
Ian Campbell
2012-Oct-16 14:45 UTC
Re: [PATCH v2 00/10] 64 bit ARM ABI, map foreign gmfn API, ARM grant tables
On Mon, 2012-10-15 at 16:48 +0100, Keir Fraser wrote:> On 15/10/2012 16:20, "Ian Campbell" <Ian.Campbell@citrix.com> wrote: > > > This is v2 of "Sweep through arm-for-4.3 branch + a bit extra" retitled > > since most of the sweep through stuff has been swept through already and > > just the bit extra remains. > > > > I''ve addressed the review comments and fixed the bisection issue. A > > bunch of this stuff is cross arch and/or touches common code. > > Those bits are fine by me, now. > > Acked-by: Keir Fraser <keir@xen.org>Thanks, I''ll give it a while for others to comment and plan to shovel it in tomorrow or Thursday unless there are objections.> > > The Linux side of the 64 bit ARM ABI changes are in mainline Linux > > already (just a few tweaks and cleanups remain). > > > > xen: arm: implement XENMEM_add_to_physmap_range > > > > New hypercall intended for use by both ARM (Linux patches exist) > > and x86 PVH (TBD) > > > > xen/arm: grant table > > > > Simple wiring up job. Acked but depends on > > XENMEM_add_to_physmap_range. > > > > arm: tools: add arm to foreign structs checking > > > > Fixes native tools build on ARM > > > > xen: xen_ulong_t substitution > > xen: change the limit of nr_extents to UINT_MAX >> MEMOP_EXTENT_SHIFT > > xen: introduce XEN_GUEST_HANDLE_PARAM > > xen: replace XEN_GUEST_HANDLE with XEN_GUEST_HANDLE_PARAM when appropriate > > xen: more XEN_GUEST_HANDLE_PARAM substitutions > > xen: remove XEN_GUEST_HANDLE(ulong) > > arm: parameter guest handles are 32 bit on 32 bit hypervisor > > > > These are the ARM 64 bit API, mostly from Stefano and posted > > several times already. > > > > Ian. > > > >
Stefano Stabellini
2012-Oct-17 13:50 UTC
Re: [PATCH 10/10] arm: parameter guest handles are 32 bit on 32 bit hypervisor
On Mon, 15 Oct 2012, Ian Campbell wrote:> Handles within structs remain 64 bit such that they are consistently > sized on both 32 and 64 bit. > > Signed-off-by: Ian Campbell <ian.campbell@citrix.com> > --- > xen/include/public/arch-arm.h | 2 +- > 1 files changed, 1 insertions(+), 1 deletions(-) > > diff --git a/xen/include/public/arch-arm.h b/xen/include/public/arch-arm.h > index ac493a5..ff02d15 100644 > --- a/xen/include/public/arch-arm.h > +++ b/xen/include/public/arch-arm.h > @@ -74,7 +74,7 @@ > #define __XEN_GUEST_HANDLE(name) __guest_handle_64_ ## name > #define XEN_GUEST_HANDLE(name) __XEN_GUEST_HANDLE(name) > /* this is going to be changed on 64 bit */ > -#define XEN_GUEST_HANDLE_PARAM(name) XEN_GUEST_HANDLE(name) > +#define XEN_GUEST_HANDLE_PARAM(name) __guest_handle_ ## name > #define set_xen_guest_handle_raw(hnd, val) \ > do { \ > typeof(&(hnd)) _sxghr_tmp = &(hnd); \I am confused. I am not sure what version of my patch "xen: introduce XEN_GUEST_HANDLE_PARAM" you have based this series upon, because the latest one I have sent, certainly contains this change: diff --git a/xen/include/public/arch-arm.h b/xen/include/public/arch-arm.h index 2ae6548..4c6d607 100644 --- a/xen/include/public/arch-arm.h +++ b/xen/include/public/arch-arm.h @@ -51,18 +51,36 @@ #define XEN_HYPERCALL_TAG 0XEA1 +#define uint64_aligned_t uint64_t __attribute__((aligned(8))) #ifndef __ASSEMBLY__ -#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \ - typedef struct { type *p; } __guest_handle_ ## name +#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \ + typedef union { type *p; unsigned long q; } \ + __guest_handle_ ## name; \ + typedef union { type *p; uint64_aligned_t q; } \ + __guest_handle_64_ ## name; +/* + * XEN_GUEST_HANDLE represents a guest pointer, when passed as a field + * in a struct in memory. On ARM is always 8 bytes sizes and 8 bytes + * aligned. + * XEN_GUEST_HANDLE_PARAM represent a guest pointer, when passed as an + * hypercall argument. It is 4 bytes on aarch and 8 bytes on aarch64. + */ #define __DEFINE_XEN_GUEST_HANDLE(name, type) \ ___DEFINE_XEN_GUEST_HANDLE(name, type); \ ___DEFINE_XEN_GUEST_HANDLE(const_##name, const type) #define DEFINE_XEN_GUEST_HANDLE(name) __DEFINE_XEN_GUEST_HANDLE(name, name) -#define __XEN_GUEST_HANDLE(name) __guest_handle_ ## name +#define __XEN_GUEST_HANDLE(name) __guest_handle_64_ ## name #define XEN_GUEST_HANDLE(name) __XEN_GUEST_HANDLE(name) -#define set_xen_guest_handle_raw(hnd, val) do { (hnd).p = val; } while (0) +/* this is going to be changes on 64 bit */ +#define XEN_GUEST_HANDLE_PARAM(name) __guest_handle_ ## name
Ian Campbell
2012-Oct-17 13:53 UTC
Re: [PATCH 10/10] arm: parameter guest handles are 32 bit on 32 bit hypervisor
On Wed, 2012-10-17 at 14:50 +0100, Stefano Stabellini wrote:> On Mon, 15 Oct 2012, Ian Campbell wrote: > > Handles within structs remain 64 bit such that they are consistently > > sized on both 32 and 64 bit. > > > > Signed-off-by: Ian Campbell <ian.campbell@citrix.com> > > --- > > xen/include/public/arch-arm.h | 2 +- > > 1 files changed, 1 insertions(+), 1 deletions(-) > > > > diff --git a/xen/include/public/arch-arm.h b/xen/include/public/arch-arm.h > > index ac493a5..ff02d15 100644 > > --- a/xen/include/public/arch-arm.h > > +++ b/xen/include/public/arch-arm.h > > @@ -74,7 +74,7 @@ > > #define __XEN_GUEST_HANDLE(name) __guest_handle_64_ ## name > > #define XEN_GUEST_HANDLE(name) __XEN_GUEST_HANDLE(name) > > /* this is going to be changed on 64 bit */ > > -#define XEN_GUEST_HANDLE_PARAM(name) XEN_GUEST_HANDLE(name) > > +#define XEN_GUEST_HANDLE_PARAM(name) __guest_handle_ ## name > > #define set_xen_guest_handle_raw(hnd, val) \ > > do { \ > > typeof(&(hnd)) _sxghr_tmp = &(hnd); \ > > I am confused. > > I am not sure what version of my patch "xen: introduce > XEN_GUEST_HANDLE_PARAM" you have based this series upon, because the > latest one I have sent, certainly contains this change:That stuff is in "xen: introduce XEN_GUEST_HANDLE_PARAM". I had to defer the final switch until after the transition to HANDLE_PARAM was complete in order to avoid breaking the build in the interim.> > > diff --git a/xen/include/public/arch-arm.h b/xen/include/public/arch-arm.h > index 2ae6548..4c6d607 100644 > --- a/xen/include/public/arch-arm.h > +++ b/xen/include/public/arch-arm.h > @@ -51,18 +51,36 @@ > > #define XEN_HYPERCALL_TAG 0XEA1 > > +#define uint64_aligned_t uint64_t __attribute__((aligned(8))) > > #ifndef __ASSEMBLY__ > -#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \ > - typedef struct { type *p; } __guest_handle_ ## name > +#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \ > + typedef union { type *p; unsigned long q; } \ > + __guest_handle_ ## name; \ > + typedef union { type *p; uint64_aligned_t q; } \ > + __guest_handle_64_ ## name; > > +/* > + * XEN_GUEST_HANDLE represents a guest pointer, when passed as a field > + * in a struct in memory. On ARM is always 8 bytes sizes and 8 bytes > + * aligned. > + * XEN_GUEST_HANDLE_PARAM represent a guest pointer, when passed as an > + * hypercall argument. It is 4 bytes on aarch and 8 bytes on aarch64. > + */ > #define __DEFINE_XEN_GUEST_HANDLE(name, type) \ > ___DEFINE_XEN_GUEST_HANDLE(name, type); \ > ___DEFINE_XEN_GUEST_HANDLE(const_##name, const type) > #define DEFINE_XEN_GUEST_HANDLE(name) __DEFINE_XEN_GUEST_HANDLE(name, name) > -#define __XEN_GUEST_HANDLE(name) __guest_handle_ ## name > +#define __XEN_GUEST_HANDLE(name) __guest_handle_64_ ## name > #define XEN_GUEST_HANDLE(name) __XEN_GUEST_HANDLE(name) > -#define set_xen_guest_handle_raw(hnd, val) do { (hnd).p = val; } while (0) > +/* this is going to be changes on 64 bit */ > +#define XEN_GUEST_HANDLE_PARAM(name) __guest_handle_ ## name >
Stefano Stabellini
2012-Oct-17 13:54 UTC
Re: [PATCH 09/10] xen: remove XEN_GUEST_HANDLE(ulong)
On Mon, 15 Oct 2012, Ian Campbell wrote:> Having both this handle (always unsigned long) and > XEN_GUEST_HANDLE(xen_ulong_t) (unsigned long on x86 and explicit size > of ARM) is confusing and error prone. > > Replace the two remaining uses of the ulong handle, in grant set and > x86 set_gdt hypercalls, with xen_ulong_t. > > This correctly sizes the grant frame entry as 64 bit on ARM but > leaves it as unsigned long on x86 (therefore no intended change on > x86). Likewise in set_gdt there is no actual change. > > Signed-off-by: Ian Campbell <ian.campbell@citrix.com> > Cc: keir@xen.org > Cc: JBeulich@suse.comAcked-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>> xen/arch/x86/mm.c | 3 ++- > xen/common/grant_table.c | 2 +- > xen/include/asm-x86/hypercall.h | 2 +- > xen/include/public/grant_table.h | 2 +- > xen/include/public/xen.h | 2 -- > 5 files changed, 5 insertions(+), 6 deletions(-) > > diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c > index 191f5ea..fad3d33 100644 > --- a/xen/arch/x86/mm.c > +++ b/xen/arch/x86/mm.c > @@ -4100,7 +4100,8 @@ long set_gdt(struct vcpu *v, > } > > > -long do_set_gdt(XEN_GUEST_HANDLE_PARAM(ulong) frame_list, unsigned int entries) > +long do_set_gdt(XEN_GUEST_HANDLE_PARAM(xen_ulong_t) frame_list, > + unsigned int entries) > { > int nr_pages = (entries + 511) / 512; > unsigned long frames[16]; > diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c > index f4ae9ee..7912769 100644 > --- a/xen/common/grant_table.c > +++ b/xen/common/grant_table.c > @@ -1322,7 +1322,7 @@ gnttab_setup_table( > struct domain *d; > struct grant_table *gt; > int i; > - unsigned long gmfn; > + xen_pfn_t gmfn; > > if ( count != 1 ) > return -EINVAL; > diff --git a/xen/include/asm-x86/hypercall.h b/xen/include/asm-x86/hypercall.h > index bd14220..afa8ba9 100644 > --- a/xen/include/asm-x86/hypercall.h > +++ b/xen/include/asm-x86/hypercall.h > @@ -33,7 +33,7 @@ do_mmu_update( > > extern long > do_set_gdt( > - XEN_GUEST_HANDLE_PARAM(ulong) frame_list, > + XEN_GUEST_HANDLE_PARAM(xen_ulong_t) frame_list, > unsigned int entries); > > extern long > diff --git a/xen/include/public/grant_table.h b/xen/include/public/grant_table.h > index 28d9476..13cc559 100644 > --- a/xen/include/public/grant_table.h > +++ b/xen/include/public/grant_table.h > @@ -385,7 +385,7 @@ struct gnttab_setup_table { > uint32_t nr_frames; > /* OUT parameters. */ > int16_t status; /* => enum grant_status */ > - XEN_GUEST_HANDLE(ulong) frame_list; > + XEN_GUEST_HANDLE(xen_pfn_t) frame_list; > }; > typedef struct gnttab_setup_table gnttab_setup_table_t; > DEFINE_XEN_GUEST_HANDLE(gnttab_setup_table_t); > diff --git a/xen/include/public/xen.h b/xen/include/public/xen.h > index e42d01f..9a5b394 100644 > --- a/xen/include/public/xen.h > +++ b/xen/include/public/xen.h > @@ -43,8 +43,6 @@ DEFINE_XEN_GUEST_HANDLE(char); > __DEFINE_XEN_GUEST_HANDLE(uchar, unsigned char); > DEFINE_XEN_GUEST_HANDLE(int); > __DEFINE_XEN_GUEST_HANDLE(uint, unsigned int); > -DEFINE_XEN_GUEST_HANDLE(long); > -__DEFINE_XEN_GUEST_HANDLE(ulong, unsigned long); > DEFINE_XEN_GUEST_HANDLE(void); > > DEFINE_XEN_GUEST_HANDLE(uint64_t); > -- > 1.7.9.1 >
Stefano Stabellini
2012-Oct-17 15:25 UTC
Re: [PATCH 10/10] arm: parameter guest handles are 32 bit on 32 bit hypervisor
On Wed, 17 Oct 2012, Ian Campbell wrote:> On Wed, 2012-10-17 at 14:50 +0100, Stefano Stabellini wrote: > > On Mon, 15 Oct 2012, Ian Campbell wrote: > > > Handles within structs remain 64 bit such that they are consistently > > > sized on both 32 and 64 bit. > > > > > > Signed-off-by: Ian Campbell <ian.campbell@citrix.com> > > > --- > > > xen/include/public/arch-arm.h | 2 +- > > > 1 files changed, 1 insertions(+), 1 deletions(-) > > > > > > diff --git a/xen/include/public/arch-arm.h b/xen/include/public/arch-arm.h > > > index ac493a5..ff02d15 100644 > > > --- a/xen/include/public/arch-arm.h > > > +++ b/xen/include/public/arch-arm.h > > > @@ -74,7 +74,7 @@ > > > #define __XEN_GUEST_HANDLE(name) __guest_handle_64_ ## name > > > #define XEN_GUEST_HANDLE(name) __XEN_GUEST_HANDLE(name) > > > /* this is going to be changed on 64 bit */ > > > -#define XEN_GUEST_HANDLE_PARAM(name) XEN_GUEST_HANDLE(name) > > > +#define XEN_GUEST_HANDLE_PARAM(name) __guest_handle_ ## name > > > #define set_xen_guest_handle_raw(hnd, val) \ > > > do { \ > > > typeof(&(hnd)) _sxghr_tmp = &(hnd); \ > > > > I am confused. > > > > I am not sure what version of my patch "xen: introduce > > XEN_GUEST_HANDLE_PARAM" you have based this series upon, because the > > latest one I have sent, certainly contains this change: > > That stuff is in "xen: introduce XEN_GUEST_HANDLE_PARAM". I had to defer > the final switch until after the transition to HANDLE_PARAM was complete > in order to avoid breaking the build in the interim.I see. Also I noticed that you wrote that in the commit message of "xen: introduce XEN_GUEST_HANDLE_PARAM", so it is OK by me. Acked-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Stefano Stabellini
2012-Oct-17 15:31 UTC
Re: [PATCH 01/10] xen: arm: implement XENMEM_add_to_physmap_range
On Mon, 15 Oct 2012, Ian Campbell wrote:> diff --git a/xen/include/public/memory.h b/xen/include/public/memory.h > index 86d02c8..f1ddbc0 100644 > --- a/xen/include/public/memory.h > +++ b/xen/include/public/memory.h > @@ -198,6 +198,15 @@ struct xen_machphys_mapping { > typedef struct xen_machphys_mapping xen_machphys_mapping_t; > DEFINE_XEN_GUEST_HANDLE(xen_machphys_mapping_t); > > +/* Source mapping space. */ > +/* ` enum phys_map_space { */I don''t think that these comments about the enum add any value. In any case the patch is simple and seems correct so: Acked-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Ian Campbell
2012-Oct-17 15:38 UTC
Re: [PATCH 01/10] xen: arm: implement XENMEM_add_to_physmap_range
On Wed, 2012-10-17 at 16:31 +0100, Stefano Stabellini wrote:> On Mon, 15 Oct 2012, Ian Campbell wrote: > > diff --git a/xen/include/public/memory.h b/xen/include/public/memory.h > > index 86d02c8..f1ddbc0 100644 > > --- a/xen/include/public/memory.h > > +++ b/xen/include/public/memory.h > > @@ -198,6 +198,15 @@ struct xen_machphys_mapping { > > typedef struct xen_machphys_mapping xen_machphys_mapping_t; > > DEFINE_XEN_GUEST_HANDLE(xen_machphys_mapping_t); > > > > +/* Source mapping space. */ > > +/* ` enum phys_map_space { */ > > I don''t think that these comments about the enum add any value.They are part of the infrastructure which generates useful symlinks and cross references in http://xenbits.xen.org/docs.> > In any case the patch is simple and seems correct so: > > Acked-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>Thanks.
Ian Campbell
2012-Oct-17 15:44 UTC
Re: [PATCH v2 00/10] 64 bit ARM ABI, map foreign gmfn API, ARM grant tables
On Tue, 2012-10-16 at 15:45 +0100, Ian Campbell wrote:> On Mon, 2012-10-15 at 16:48 +0100, Keir Fraser wrote: > > On 15/10/2012 16:20, "Ian Campbell" <Ian.Campbell@citrix.com> wrote: > > > > > This is v2 of "Sweep through arm-for-4.3 branch + a bit extra" retitled > > > since most of the sweep through stuff has been swept through already and > > > just the bit extra remains. > > > > > > I''ve addressed the review comments and fixed the bisection issue. A > > > bunch of this stuff is cross arch and/or touches common code. > > > > Those bits are fine by me, now. > > > > Acked-by: Keir Fraser <keir@xen.org> > > Thanks, I''ll give it a while for others to comment and plan to shovel it > in tomorrow or Thursday unless there are objections.Added Stefano''s + your acks and pushed, thanks Ian.
>>> On 15.10.12 at 17:20, Ian Campbell <ian.campbell@citrix.com> wrote: > --- a/xen/include/public/grant_table.h > +++ b/xen/include/public/grant_table.h > @@ -385,7 +385,7 @@ struct gnttab_setup_table { > uint32_t nr_frames; > /* OUT parameters. */ > int16_t status; /* => enum grant_status */ > - XEN_GUEST_HANDLE(ulong) frame_list; > + XEN_GUEST_HANDLE(xen_pfn_t) frame_list; > }; > typedef struct gnttab_setup_table gnttab_setup_table_t; > DEFINE_XEN_GUEST_HANDLE(gnttab_setup_table_t); > --- a/xen/include/public/xen.h > +++ b/xen/include/public/xen.h > @@ -43,8 +43,6 @@ DEFINE_XEN_GUEST_HANDLE(char); > __DEFINE_XEN_GUEST_HANDLE(uchar, unsigned char); > DEFINE_XEN_GUEST_HANDLE(int); > __DEFINE_XEN_GUEST_HANDLE(uint, unsigned int); > -DEFINE_XEN_GUEST_HANDLE(long); > -__DEFINE_XEN_GUEST_HANDLE(ulong, unsigned long); > DEFINE_XEN_GUEST_HANDLE(void); > > DEFINE_XEN_GUEST_HANDLE(uint64_t);These two must be wrapped in __XEN_INTERFACE_VERSION__ conditionals (and __XEN_LATEST_INTERFACE_VERSION__ needs to be bumped accordingly), since the various guest handles are distinct types (i.e. consumers will fail to build if not updated). Jan
On Thu, 2012-10-18 at 07:50 +0100, Jan Beulich wrote:> >>> On 15.10.12 at 17:20, Ian Campbell <ian.campbell@citrix.com> wrote: > > --- a/xen/include/public/grant_table.h > > +++ b/xen/include/public/grant_table.h > > @@ -385,7 +385,7 @@ struct gnttab_setup_table { > > uint32_t nr_frames; > > /* OUT parameters. */ > > int16_t status; /* => enum grant_status */ > > - XEN_GUEST_HANDLE(ulong) frame_list; > > + XEN_GUEST_HANDLE(xen_pfn_t) frame_list; > > }; > > typedef struct gnttab_setup_table gnttab_setup_table_t; > > DEFINE_XEN_GUEST_HANDLE(gnttab_setup_table_t); > > --- a/xen/include/public/xen.h > > +++ b/xen/include/public/xen.h > > @@ -43,8 +43,6 @@ DEFINE_XEN_GUEST_HANDLE(char); > > __DEFINE_XEN_GUEST_HANDLE(uchar, unsigned char); > > DEFINE_XEN_GUEST_HANDLE(int); > > __DEFINE_XEN_GUEST_HANDLE(uint, unsigned int); > > -DEFINE_XEN_GUEST_HANDLE(long); > > -__DEFINE_XEN_GUEST_HANDLE(ulong, unsigned long); > > DEFINE_XEN_GUEST_HANDLE(void); > > > > DEFINE_XEN_GUEST_HANDLE(uint64_t); > > These two must be wrapped in __XEN_INTERFACE_VERSION__ > conditionals (and __XEN_LATEST_INTERFACE_VERSION__ needs > to be bumped accordingly), since the various guest handles are > distinct types (i.e. consumers will fail to build if not updated).Are there external consumers of gnttab_setup_table? Nevertheless, here is the fix. 8<----------------------------------------------------- # HG changeset patch # User Ian Campbell <ijc@hellion.org.uk> # Date 1350544609 -3600 # Node ID 68f0f7ed3e7b3b7b4b9dbc692a448421ebc31035 # Parent 5c402b905e00fb0871c3f439c8391dd3cfb3bc10 xen: retain ulong guest handle for older consumers. 26072:5529b91bd2e4 removed this but we need to keep it around for older consumers. Bump __XEN_LATEST_INTERFACE_VERSION__ accordingly. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> diff -r 5c402b905e00 -r 68f0f7ed3e7b xen/include/public/grant_table.h --- a/xen/include/public/grant_table.h Wed Oct 17 16:43:55 2012 +0100 +++ b/xen/include/public/grant_table.h Thu Oct 18 08:16:49 2012 +0100 @@ -385,7 +385,11 @@ struct gnttab_setup_table { uint32_t nr_frames; /* OUT parameters. */ int16_t status; /* => enum grant_status */ +#if __XEN_INTERFACE_VERSION__ < 0x00040300 + XEN_GUEST_HANDLE(ulong) frame_list; +#else XEN_GUEST_HANDLE(xen_pfn_t) frame_list; +#endif }; typedef struct gnttab_setup_table gnttab_setup_table_t; DEFINE_XEN_GUEST_HANDLE(gnttab_setup_table_t); diff -r 5c402b905e00 -r 68f0f7ed3e7b xen/include/public/xen-compat.h --- a/xen/include/public/xen-compat.h Wed Oct 17 16:43:55 2012 +0100 +++ b/xen/include/public/xen-compat.h Thu Oct 18 08:16:49 2012 +0100 @@ -27,7 +27,7 @@ #ifndef __XEN_PUBLIC_XEN_COMPAT_H__ #define __XEN_PUBLIC_XEN_COMPAT_H__ -#define __XEN_LATEST_INTERFACE_VERSION__ 0x00040200 +#define __XEN_LATEST_INTERFACE_VERSION__ 0x00040300 #if defined(__XEN__) || defined(__XEN_TOOLS__) /* Xen is built with matching headers and implements the latest interface. */ diff -r 5c402b905e00 -r 68f0f7ed3e7b xen/include/public/xen.h --- a/xen/include/public/xen.h Wed Oct 17 16:43:55 2012 +0100 +++ b/xen/include/public/xen.h Thu Oct 18 08:16:49 2012 +0100 @@ -43,6 +43,10 @@ DEFINE_XEN_GUEST_HANDLE(char); __DEFINE_XEN_GUEST_HANDLE(uchar, unsigned char); DEFINE_XEN_GUEST_HANDLE(int); __DEFINE_XEN_GUEST_HANDLE(uint, unsigned int); +#if __XEN_INTERFACE_VERSION__ < 0x00040300 +DEFINE_XEN_GUEST_HANDLE(long); +__DEFINE_XEN_GUEST_HANDLE(ulong, unsigned long); +#endif DEFINE_XEN_GUEST_HANDLE(void); DEFINE_XEN_GUEST_HANDLE(uint64_t);
>>> On 18.10.12 at 09:32, Ian Campbell <Ian.Campbell@citrix.com> wrote: > On Thu, 2012-10-18 at 07:50 +0100, Jan Beulich wrote: >> >>> On 15.10.12 at 17:20, Ian Campbell <ian.campbell@citrix.com> wrote: >> These two must be wrapped in __XEN_INTERFACE_VERSION__ >> conditionals (and __XEN_LATEST_INTERFACE_VERSION__ needs >> to be bumped accordingly), since the various guest handles are >> distinct types (i.e. consumers will fail to build if not updated). > > Are there external consumers of gnttab_setup_table?We can''t know - it''s a public, not tools-only interface.> Nevertheless, here is the fix. > > 8<----------------------------------------------------- > > # HG changeset patch > # User Ian Campbell <ijc@hellion.org.uk> > # Date 1350544609 -3600 > # Node ID 68f0f7ed3e7b3b7b4b9dbc692a448421ebc31035 > # Parent 5c402b905e00fb0871c3f439c8391dd3cfb3bc10 > xen: retain ulong guest handle for older consumers. > > 26072:5529b91bd2e4 removed this but we need to keep it around for > older consumers. Bump __XEN_LATEST_INTERFACE_VERSION__ accordingly. > > Signed-off-by: Ian Campbell <ian.campbell@citrix.com>Acked-by: Jan Beulich <jbeulich@suse.com>> diff -r 5c402b905e00 -r 68f0f7ed3e7b xen/include/public/grant_table.h > --- a/xen/include/public/grant_table.h Wed Oct 17 16:43:55 2012 +0100 > +++ b/xen/include/public/grant_table.h Thu Oct 18 08:16:49 2012 +0100 > @@ -385,7 +385,11 @@ struct gnttab_setup_table { > uint32_t nr_frames; > /* OUT parameters. */ > int16_t status; /* => enum grant_status */ > +#if __XEN_INTERFACE_VERSION__ < 0x00040300 > + XEN_GUEST_HANDLE(ulong) frame_list; > +#else > XEN_GUEST_HANDLE(xen_pfn_t) frame_list; > +#endif > }; > typedef struct gnttab_setup_table gnttab_setup_table_t; > DEFINE_XEN_GUEST_HANDLE(gnttab_setup_table_t); > diff -r 5c402b905e00 -r 68f0f7ed3e7b xen/include/public/xen-compat.h > --- a/xen/include/public/xen-compat.h Wed Oct 17 16:43:55 2012 +0100 > +++ b/xen/include/public/xen-compat.h Thu Oct 18 08:16:49 2012 +0100 > @@ -27,7 +27,7 @@ > #ifndef __XEN_PUBLIC_XEN_COMPAT_H__ > #define __XEN_PUBLIC_XEN_COMPAT_H__ > > -#define __XEN_LATEST_INTERFACE_VERSION__ 0x00040200 > +#define __XEN_LATEST_INTERFACE_VERSION__ 0x00040300 > > #if defined(__XEN__) || defined(__XEN_TOOLS__) > /* Xen is built with matching headers and implements the latest interface. > */ > diff -r 5c402b905e00 -r 68f0f7ed3e7b xen/include/public/xen.h > --- a/xen/include/public/xen.h Wed Oct 17 16:43:55 2012 +0100 > +++ b/xen/include/public/xen.h Thu Oct 18 08:16:49 2012 +0100 > @@ -43,6 +43,10 @@ DEFINE_XEN_GUEST_HANDLE(char); > __DEFINE_XEN_GUEST_HANDLE(uchar, unsigned char); > DEFINE_XEN_GUEST_HANDLE(int); > __DEFINE_XEN_GUEST_HANDLE(uint, unsigned int); > +#if __XEN_INTERFACE_VERSION__ < 0x00040300 > +DEFINE_XEN_GUEST_HANDLE(long); > +__DEFINE_XEN_GUEST_HANDLE(ulong, unsigned long); > +#endif > DEFINE_XEN_GUEST_HANDLE(void); > > DEFINE_XEN_GUEST_HANDLE(uint64_t);
On Thu, 2012-10-18 at 08:50 +0100, Jan Beulich wrote:> >>> On 18.10.12 at 09:32, Ian Campbell <Ian.Campbell@citrix.com> wrote: > > On Thu, 2012-10-18 at 07:50 +0100, Jan Beulich wrote: > >> >>> On 15.10.12 at 17:20, Ian Campbell <ian.campbell@citrix.com> wrote: > >> These two must be wrapped in __XEN_INTERFACE_VERSION__ > >> conditionals (and __XEN_LATEST_INTERFACE_VERSION__ needs > >> to be bumped accordingly), since the various guest handles are > >> distinct types (i.e. consumers will fail to build if not updated). > > > > Are there external consumers of gnttab_setup_table? > > We can''t know - it''s a public, not tools-only interface.Right.> > Nevertheless, here is the fix. > > > > 8<----------------------------------------------------- > > > > # HG changeset patch > > # User Ian Campbell <ijc@hellion.org.uk> > > # Date 1350544609 -3600 > > # Node ID 68f0f7ed3e7b3b7b4b9dbc692a448421ebc31035 > > # Parent 5c402b905e00fb0871c3f439c8391dd3cfb3bc10 > > xen: retain ulong guest handle for older consumers. > > > > 26072:5529b91bd2e4 removed this but we need to keep it around for > > older consumers. Bump __XEN_LATEST_INTERFACE_VERSION__ accordingly. > > > > Signed-off-by: Ian Campbell <ian.campbell@citrix.com> > > Acked-by: Jan Beulich <jbeulich@suse.com>Applied, thanks.> > > diff -r 5c402b905e00 -r 68f0f7ed3e7b xen/include/public/grant_table.h > > --- a/xen/include/public/grant_table.h Wed Oct 17 16:43:55 2012 +0100 > > +++ b/xen/include/public/grant_table.h Thu Oct 18 08:16:49 2012 +0100 > > @@ -385,7 +385,11 @@ struct gnttab_setup_table { > > uint32_t nr_frames; > > /* OUT parameters. */ > > int16_t status; /* => enum grant_status */ > > +#if __XEN_INTERFACE_VERSION__ < 0x00040300 > > + XEN_GUEST_HANDLE(ulong) frame_list; > > +#else > > XEN_GUEST_HANDLE(xen_pfn_t) frame_list; > > +#endif > > }; > > typedef struct gnttab_setup_table gnttab_setup_table_t; > > DEFINE_XEN_GUEST_HANDLE(gnttab_setup_table_t); > > diff -r 5c402b905e00 -r 68f0f7ed3e7b xen/include/public/xen-compat.h > > --- a/xen/include/public/xen-compat.h Wed Oct 17 16:43:55 2012 +0100 > > +++ b/xen/include/public/xen-compat.h Thu Oct 18 08:16:49 2012 +0100 > > @@ -27,7 +27,7 @@ > > #ifndef __XEN_PUBLIC_XEN_COMPAT_H__ > > #define __XEN_PUBLIC_XEN_COMPAT_H__ > > > > -#define __XEN_LATEST_INTERFACE_VERSION__ 0x00040200 > > +#define __XEN_LATEST_INTERFACE_VERSION__ 0x00040300 > > > > #if defined(__XEN__) || defined(__XEN_TOOLS__) > > /* Xen is built with matching headers and implements the latest interface. > > */ > > diff -r 5c402b905e00 -r 68f0f7ed3e7b xen/include/public/xen.h > > --- a/xen/include/public/xen.h Wed Oct 17 16:43:55 2012 +0100 > > +++ b/xen/include/public/xen.h Thu Oct 18 08:16:49 2012 +0100 > > @@ -43,6 +43,10 @@ DEFINE_XEN_GUEST_HANDLE(char); > > __DEFINE_XEN_GUEST_HANDLE(uchar, unsigned char); > > DEFINE_XEN_GUEST_HANDLE(int); > > __DEFINE_XEN_GUEST_HANDLE(uint, unsigned int); > > +#if __XEN_INTERFACE_VERSION__ < 0x00040300 > > +DEFINE_XEN_GUEST_HANDLE(long); > > +__DEFINE_XEN_GUEST_HANDLE(ulong, unsigned long); > > +#endif > > DEFINE_XEN_GUEST_HANDLE(void); > > > > DEFINE_XEN_GUEST_HANDLE(uint64_t); > > >