qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] s390x: pv: Fence additional unavailable SCLP facilities for


From: Christian Borntraeger
Subject: Re: [PATCH] s390x: pv: Fence additional unavailable SCLP facilities for PV guests
Date: Tue, 8 Dec 2020 14:29:57 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.4.0


On 04.12.20 09:36, Janosch Frank wrote:
> There's no VSIE support for a protected guest, so let's better not
> advertise it and its support facilities.
> 
> Signed-off-by: Janosch Frank <frankja@linux.ibm.com>

Looks sane. Assuming that all features that depend on SIE are named 
S390_FEAT_SIE_*
this should take care of everything. (i compared to gen-facilities.c)

> ---
> CI:
> https://gitlab.com/frankja/qemu/-/pipelines/224881703
> ---
>  target/s390x/cpu_features.c | 38 ++++++++++++++++++++++++++++++++++++-
>  target/s390x/cpu_models.c   | 24 +++++++++++++++++++++--
>  2 files changed, 59 insertions(+), 3 deletions(-)
> 
> diff --git a/target/s390x/cpu_features.c b/target/s390x/cpu_features.c
> index 42fe0bf4ca..7d7ea8e3b8 100644
> --- a/target/s390x/cpu_features.c
> +++ b/target/s390x/cpu_features.c
> @@ -107,8 +107,44 @@ void s390_fill_feat_block(const S390FeatBitmap features, 
> S390FeatType type,
>          feat = find_next_bit(features, S390_FEAT_MAX, feat + 1);
>      }
>  
> -    if (type == S390_FEAT_TYPE_SCLP_FAC134 && s390_is_pv()) {
> +    if (!s390_is_pv()) {
> +        return;
> +    }
> +
> +    /*
> +     * Some facilities are not available for CPUs in protected mode:
> +     * - All SIE facilities because SIE is not available
> +     * - DIAG318
> +     *
> +     * As VMs can move in and out of protected mode the CPU model
> +     * doesn't protect us from that problem because it is only
> +     * validated at the start of the VM.
> +     */
> +    switch (type) {
> +    case S390_FEAT_TYPE_SCLP_CPU:
> +        clear_be_bit(s390_feat_def(S390_FEAT_SIE_F2)->bit, data);
> +        clear_be_bit(s390_feat_def(S390_FEAT_SIE_SKEY)->bit, data);
> +        clear_be_bit(s390_feat_def(S390_FEAT_SIE_GPERE)->bit, data);
> +        clear_be_bit(s390_feat_def(S390_FEAT_SIE_SIIF)->bit, data);
> +        clear_be_bit(s390_feat_def(S390_FEAT_SIE_SIGPIF)->bit, data);
> +        clear_be_bit(s390_feat_def(S390_FEAT_SIE_IB)->bit, data);
> +        clear_be_bit(s390_feat_def(S390_FEAT_SIE_CEI)->bit, data);
> +        break;
> +    case S390_FEAT_TYPE_SCLP_CONF_CHAR:
> +        clear_be_bit(s390_feat_def(S390_FEAT_SIE_KSS)->bit, data);
> +        clear_be_bit(s390_feat_def(S390_FEAT_SIE_GSLS)->bit, data);
> +        break;
> +    case S390_FEAT_TYPE_SCLP_CONF_CHAR_EXT:
> +        clear_be_bit(s390_feat_def(S390_FEAT_SIE_64BSCAO)->bit, data);
> +        clear_be_bit(s390_feat_def(S390_FEAT_SIE_CMMA)->bit, data);
> +        clear_be_bit(s390_feat_def(S390_FEAT_SIE_PFMFI)->bit, data);
> +        clear_be_bit(s390_feat_def(S390_FEAT_SIE_IBS)->bit, data);
> +        break;
> +    case S390_FEAT_TYPE_SCLP_FAC134:
>          clear_be_bit(s390_feat_def(S390_FEAT_DIAG_318)->bit, data);
> +        break;
> +    default:
> +        return;
>      }
>  }
>  
> diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c
> index b5abff8bef..51feb71546 100644
> --- a/target/s390x/cpu_models.c
> +++ b/target/s390x/cpu_models.c
> @@ -239,8 +239,28 @@ bool s390_has_feat(S390Feat feat)
>          }
>          return 0;
>      }
> -    if (feat == S390_FEAT_DIAG_318 && s390_is_pv()) {
> -        return false;
> +
> +    if (s390_is_pv()) {
> +        switch (feat) {
> +        case S390_FEAT_DIAG_318:
> +        case S390_FEAT_SIE_F2:
> +        case S390_FEAT_SIE_SKEY:
> +        case S390_FEAT_SIE_GPERE:
> +        case S390_FEAT_SIE_SIIF:
> +        case S390_FEAT_SIE_SIGPIF:
> +        case S390_FEAT_SIE_IB:
> +        case S390_FEAT_SIE_CEI:
> +        case S390_FEAT_SIE_KSS:
> +        case S390_FEAT_SIE_GSLS:
> +        case S390_FEAT_SIE_64BSCAO:
> +        case S390_FEAT_SIE_CMMA:
> +        case S390_FEAT_SIE_PFMFI:
> +        case S390_FEAT_SIE_IBS:
> +            return false;
> +            break;
> +        default:
> +            break;
> +        }
>      }
>      return test_bit(feat, cpu->model->features);
>  }
> 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]