From: Vijaya Kumar K Date: Fri, 26 Sep 2014 05:58:47 +0000 (+0530) Subject: xen/arm: check on domain type against hardware support X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~4255^2 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=1aa064329a4cf313ed9f0b5a0306237585dbddb9;p=xen.git xen/arm: check on domain type against hardware support Some arm64 platforms implement only aarch64 mode. So allow domains that are only 64-bit Signed-off-by: Vijaya Kumar K Acked-by: Ian Campbell [ ijc -- s/cpu_has_a32/cpu_has_arm/ as discussed on list ] --- diff --git a/xen/arch/arm/arm64/domctl.c b/xen/arch/arm/arm64/domctl.c index 41e2562898..c0ff248bae 100644 --- a/xen/arch/arm/arm64/domctl.c +++ b/xen/arch/arm/arm64/domctl.c @@ -11,6 +11,7 @@ #include #include #include +#include static long switch_mode(struct domain *d, enum domain_type type) { @@ -35,6 +36,8 @@ long subarch_do_domctl(struct xen_domctl *domctl, struct domain *d, switch ( domctl->u.address_size.size ) { case 32: + if ( !cpu_has_el1_32 ) + return -EINVAL; return switch_mode(d, DOMAIN_32BIT); case 64: return switch_mode(d, DOMAIN_64BIT); diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c index 90abc3ad12..138ca89a30 100644 --- a/xen/arch/arm/domain_build.c +++ b/xen/arch/arm/domain_build.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -1274,6 +1275,12 @@ int construct_dom0(struct domain *d) return rc; #ifdef CONFIG_ARM_64 + /* if aarch32 mode is not supported at EL1 do not allow 32-bit domain */ + if ( !(cpu_has_el1_32) && kinfo.type == DOMAIN_32BIT ) + { + printk("Platform does not support 32-bit domain\n"); + return -EINVAL; + } d->arch.type = kinfo.type; #endif diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c index c43c776a08..d2dcc3a71f 100644 --- a/xen/arch/arm/setup.c +++ b/xen/arch/arm/setup.c @@ -127,8 +127,9 @@ static void __init processor_id(void) printk("32-bit Execution:\n"); printk(" Processor Features: %08"PRIx32":%08"PRIx32"\n", boot_cpu_data.pfr32.bits[0], boot_cpu_data.pfr32.bits[1]); - printk(" Instruction Sets:%s%s%s%s%s\n", + printk(" Instruction Sets:%s%s%s%s%s%s\n", cpu_has_aarch32 ? " AArch32" : "", + cpu_has_arm ? " A32" : "", cpu_has_thumb ? " Thumb" : "", cpu_has_thumb2 ? " Thumb-2" : "", cpu_has_thumbee ? " ThumbEE" : "", @@ -852,8 +853,11 @@ void arch_get_xen_caps(xen_capabilities_info_t *info) snprintf(s, sizeof(s), "xen-%d.%d-aarch64 ", major, minor); safe_strcat(*info, s); #endif - snprintf(s, sizeof(s), "xen-%d.%d-armv7l ", major, minor); - safe_strcat(*info, s); + if ( cpu_has_aarch32 ) + { + snprintf(s, sizeof(s), "xen-%d.%d-armv7l ", major, minor); + safe_strcat(*info, s); + } } /* diff --git a/xen/include/asm-arm/cpufeature.h b/xen/include/asm-arm/cpufeature.h index 7a6d3de37d..7b519cddc6 100644 --- a/xen/include/asm-arm/cpufeature.h +++ b/xen/include/asm-arm/cpufeature.h @@ -21,11 +21,12 @@ #define cpu_feature32(c, feat) ((c)->pfr32.feat) #define boot_cpu_feature32(feat) (boot_cpu_data.pfr32.feat) -#define cpu_has_aarch32 (boot_cpu_feature32(arm) == 1) +#define cpu_has_arm (boot_cpu_feature32(arm) == 1) #define cpu_has_thumb (boot_cpu_feature32(thumb) >= 1) #define cpu_has_thumb2 (boot_cpu_feature32(thumb) >= 3) #define cpu_has_jazelle (boot_cpu_feature32(jazelle) >= 0) #define cpu_has_thumbee (boot_cpu_feature32(thumbee) == 1) +#define cpu_has_aarch32 (cpu_has_arm || cpu_has_thumb) #ifdef CONFIG_ARM_32 #define cpu_has_gentimer (boot_cpu_feature32(gentimer) == 1)