From: Jan Beulich Date: Mon, 23 Mar 2015 15:49:42 +0000 (+0100) Subject: vm-assist: prepare for discontiguous used bit numbers X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~3544 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=88a2372c6ba44dd42b915a95a823cf9d4d260e25;p=xen.git vm-assist: prepare for discontiguous used bit numbers Since the a flag will get assigned a value discontiguous to the existing ones (in order to preserve the low bits, as only those are currently accessible to 32-bit guests), this requires a little bit of rework of the VM assist code in general: An architecture specific VM_ASSIST_VALID definition gets introduced (with an optional compat mode counterpart), and compilation of the respective code becomes conditional upon this being defined (ARM doesn't wire these up and hence doesn't need that code). Signed-off-by: Jan Beulich Reviewed-by: Tim Deegan --- diff --git a/xen/common/compat/kernel.c b/xen/common/compat/kernel.c index 6a1e41f93a..65cc25bd49 100644 --- a/xen/common/compat/kernel.c +++ b/xen/common/compat/kernel.c @@ -41,6 +41,11 @@ CHECK_TYPE(domain_handle); #define xennmi_callback compat_nmi_callback #define xennmi_callback_t compat_nmi_callback_t +#ifdef COMPAT_VM_ASSIST_VALID +#undef VM_ASSIST_VALID +#define VM_ASSIST_VALID COMPAT_VM_ASSIST_VALID +#endif + #define DO(fn) int compat_##fn #define COMPAT diff --git a/xen/common/domain.c b/xen/common/domain.c index aa78fd74e2..2b192ab88e 100644 --- a/xen/common/domain.c +++ b/xen/common/domain.c @@ -1318,9 +1318,11 @@ long do_vcpu_op(int cmd, unsigned int vcpuid, XEN_GUEST_HANDLE_PARAM(void) arg) return rc; } -long vm_assist(struct domain *p, unsigned int cmd, unsigned int type) +#ifdef VM_ASSIST_VALID +long vm_assist(struct domain *p, unsigned int cmd, unsigned int type, + unsigned long valid) { - if ( type > MAX_VMASST_TYPE ) + if ( type >= BITS_PER_LONG || !test_bit(type, &valid) ) return -EINVAL; switch ( cmd ) @@ -1335,6 +1337,7 @@ long vm_assist(struct domain *p, unsigned int cmd, unsigned int type) return -ENOSYS; } +#endif struct pirq *pirq_get_info(struct domain *d, int pirq) { diff --git a/xen/common/kernel.c b/xen/common/kernel.c index d8c31bc89f..3a29d9bbba 100644 --- a/xen/common/kernel.c +++ b/xen/common/kernel.c @@ -386,10 +386,12 @@ DO(nmi_op)(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg) return rc; } +#ifdef VM_ASSIST_VALID DO(vm_assist)(unsigned int cmd, unsigned int type) { - return vm_assist(current->domain, cmd, type); + return vm_assist(current->domain, cmd, type, VM_ASSIST_VALID); } +#endif DO(ni_hypercall)(void) { diff --git a/xen/include/asm-x86/config.h b/xen/include/asm-x86/config.h index 270f69495d..3569753da7 100644 --- a/xen/include/asm-x86/config.h +++ b/xen/include/asm-x86/config.h @@ -343,6 +343,14 @@ extern unsigned long xen_phys_start; #define ARG_XLAT_START(v) \ (ARG_XLAT_VIRT_START + ((v)->vcpu_id << ARG_XLAT_VA_SHIFT)) +#define NATIVE_VM_ASSIST_VALID ((1UL << VMASST_TYPE_4gb_segments) | \ + (1UL << VMASST_TYPE_4gb_segments_notify) | \ + (1UL << VMASST_TYPE_writable_pagetables) | \ + (1UL << VMASST_TYPE_pae_extended_cr3)) +#define VM_ASSIST_VALID NATIVE_VM_ASSIST_VALID +#define COMPAT_VM_ASSIST_VALID (NATIVE_VM_ASSIST_VALID & \ + ((1UL << COMPAT_BITS_PER_LONG) - 1)) + #define ELFSIZE 64 #define ARCH_CRASH_SAVE_VMCOREINFO diff --git a/xen/include/public/xen.h b/xen/include/public/xen.h index 3703c3936e..a354f5c8d6 100644 --- a/xen/include/public/xen.h +++ b/xen/include/public/xen.h @@ -486,7 +486,9 @@ DEFINE_XEN_GUEST_HANDLE(mmuext_op_t); /* x86/PAE guests: support PDPTs above 4GB. */ #define VMASST_TYPE_pae_extended_cr3 3 +#if __XEN_INTERFACE_VERSION__ < 0x00040600 #define MAX_VMASST_TYPE 3 +#endif #ifndef __ASSEMBLY__ diff --git a/xen/include/xen/lib.h b/xen/include/xen/lib.h index 6c8dd86ae8..8fa95ac52a 100644 --- a/xen/include/xen/lib.h +++ b/xen/include/xen/lib.h @@ -80,7 +80,8 @@ extern void guest_printk(const struct domain *d, const char *format, ...) __attribute__ ((format (printf, 2, 3))); extern void noreturn panic(const char *format, ...) __attribute__ ((format (printf, 1, 2))); -extern long vm_assist(struct domain *, unsigned int, unsigned int); +extern long vm_assist(struct domain *, unsigned int cmd, unsigned int type, + unsigned long valid); extern int __printk_ratelimit(int ratelimit_ms, int ratelimit_burst); extern int printk_ratelimit(void);