From: David Vrabel <david.vrabel@xxxxxxxxxx> GUEST_HANDLE_64() and uint64_aligned_t allow hypercall ABI structures to be identical (binary compatible) for 32 and 64-bit guests. They are currently limited to only being available for use in sysctls and domctls. Relax this restriction so they may be used by any new structures. There is a minimal cost for 32-bit guests on 64-but hypervisors as set_xen_guest_handle() needs to zero the whole field on GUEST_HANDLE_64() handles, but this is expected to be less than the overhead of having to translate compat structures. Signed-off-by: David Vrabel <david.vrabel at citrix.com> --- xen/include/public/arch-x86/xen-x86_32.h | 4 +--- xen/include/public/xen.h | 13 ++++++++----- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/xen/include/public/arch-x86/xen-x86_32.h b/xen/include/public/arch-x86/xen-x86_32.h index 1504191..f6b4f49 100644 --- a/xen/include/public/arch-x86/xen-x86_32.h +++ b/xen/include/public/arch-x86/xen-x86_32.h @@ -91,8 +91,7 @@ #define machine_to_phys_mapping ((unsigned long *)MACH2PHYS_VIRT_START) #endif -/* 32-/64-bit invariability for control interfaces (domctl/sysctl). */ -#if defined(__XEN__) || defined(__XEN_TOOLS__) +/* 32-/64-bit invariability. */ #undef ___DEFINE_XEN_GUEST_HANDLE #define ___DEFINE_XEN_GUEST_HANDLE(name, type) \ typedef struct { type *p; } \ @@ -107,7 +106,6 @@ #define uint64_aligned_t uint64_t __attribute__((aligned(8))) #define __XEN_GUEST_HANDLE_64(name) __guest_handle_64_ ## name #define XEN_GUEST_HANDLE_64(name) __XEN_GUEST_HANDLE_64(name) -#endif #ifndef __ASSEMBLY__ diff --git a/xen/include/public/xen.h b/xen/include/public/xen.h index 4dd9615..d0aa0c5 100644 --- a/xen/include/public/xen.h +++ b/xen/include/public/xen.h @@ -858,9 +858,14 @@ __DEFINE_XEN_GUEST_HANDLE(uint64, uint64_t); #endif /* !__ASSEMBLY__ */ -/* Default definitions for macros used by domctl/sysctl. */ -#if defined(__XEN__) || defined(__XEN_TOOLS__) - +/* + * Default definitions for 32/64-bit invariant macros. + * + * Use these in ABI structures that should be identical for 32 and + * 64-bit guests. There is some (very small) overhead in using + * XEN_GUEST_HANDLE_64() instead of XEN_GUEST_HANDLE() so avoid for + * very hot paths. + */ #ifndef uint64_aligned_t #define uint64_aligned_t uint64_t #endif @@ -875,8 +880,6 @@ struct xenctl_cpumap { }; #endif -#endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */ - #endif /* __XEN_PUBLIC_XEN_H__ */ /* -- 1.7.2.5