From: Wei Liu Date: Fri, 2 Nov 2018 15:55:40 +0000 (+0000) Subject: x86/domctl: rework XEN_DOMCTL_{set,get}_address_size X-Git-Tag: archive/raspbian/4.14.0+80-gd101b417b7-1+rpi1^2~63^2~3060 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=f969bc9fc966d3f00d756922f35c2b6ebf533967;p=xen.git x86/domctl: rework XEN_DOMCTL_{set,get}_address_size Going through toolstack code, they are used for PV guests only. Tighten their access to PV only. Return -EOPNOTSUPP if they are called on HVM guests. Rewrite the code in a pattern that makes DCE work. Signed-off-by: Wei Liu Reviewed-by: Andrew Cooper --- diff --git a/xen/arch/x86/domctl.c b/xen/arch/x86/domctl.c index f79827e6e4..33f9a869c0 100644 --- a/xen/arch/x86/domctl.c +++ b/xen/arch/x86/domctl.c @@ -609,19 +609,33 @@ long arch_do_domctl( break; case XEN_DOMCTL_set_address_size: - if ( ((domctl->u.address_size.size == 64) && !d->arch.is_32bit_pv) || - ((domctl->u.address_size.size == 32) && d->arch.is_32bit_pv) ) - ret = 0; - else if ( domctl->u.address_size.size == 32 ) - ret = switch_compat(d); + if ( is_hvm_domain(d) ) + ret = -EOPNOTSUPP; + else if ( is_pv_domain(d) ) + { + if ( ((domctl->u.address_size.size == 64) && !d->arch.is_32bit_pv) || + ((domctl->u.address_size.size == 32) && d->arch.is_32bit_pv) ) + ret = 0; + else if ( domctl->u.address_size.size == 32 ) + ret = switch_compat(d); + else + ret = -EINVAL; + } else - ret = -EINVAL; + ASSERT_UNREACHABLE(); break; case XEN_DOMCTL_get_address_size: - domctl->u.address_size.size = is_pv_32bit_domain(d) ? 32 : - BITS_PER_LONG; - copyback = true; + if ( is_hvm_domain(d) ) + ret = -EOPNOTSUPP; + else if ( is_pv_domain(d) ) + { + domctl->u.address_size.size = + is_pv_32bit_domain(d) ? 32 : BITS_PER_LONG; + copyback = true; + } + else + ASSERT_UNREACHABLE(); break; case XEN_DOMCTL_set_machine_address_size: