From: Alexander Graf <agraf@csgraf.de>
To: Peter Maydell <peter.maydell@linaro.org>
Cc: "Richard Henderson" <richard.henderson@linaro.org>,
qemu-arm@nongnu.org, "Alex Bennée" <alex.bennee@linaro.org>,
qemu-devel@nongnu.org,
"Andrei Warkentin" <andrey.warkentin@gmail.com>
Subject: Re: [PATCH] arm: Don't remove EL3 exposure for SMC conduit
Date: Sun, 14 Nov 2021 22:35:28 +0100 [thread overview]
Message-ID: <55997def-c09c-00c8-711a-50a2ac6e7576@csgraf.de> (raw)
In-Reply-To: <8639608F-1685-48B8-B965-255D30B213F8@csgraf.de>
On 14.11.21 18:41, Alexander Graf wrote:
>
>> Am 14.11.2021 um 18:20 schrieb Peter Maydell <peter.maydell@linaro.org>:
>>
>> On Sun, 14 Nov 2021 at 10:56, Alexander Graf <agraf@csgraf.de> wrote:
>>> When we expose an SMC conduit, we're implicitly telling the guest that
>>> there is EL3 available because it needs to call it. While that EL3 then
>>> is not backed by the emulated CPU, from the guest's EL2 point of view,
>>> it still means there is an EL3 to call into.
>>>
>>> This is a problem for VMware ESXi, which validates EL3 availability before
>>> doing SMC calls. With this patch, VMware ESXi works with SMP in TCG.
>>>
>>> Reported-by: Andrei Warkentin <andrey.warkentin@gmail.com>
>>> Signed-off-by: Alexander Graf <agraf@csgraf.de>
>>> ---
>>> target/arm/cpu.c | 20 +++++++++++++++-----
>>> 1 file changed, 15 insertions(+), 5 deletions(-)
>>>
>>> diff --git a/target/arm/cpu.c b/target/arm/cpu.c
>>> index a211804fd3..21092c5242 100644
>>> --- a/target/arm/cpu.c
>>> +++ b/target/arm/cpu.c
>>> @@ -1782,11 +1782,21 @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
>>> */
>>> unset_feature(env, ARM_FEATURE_EL3);
>>>
>>> - /* Disable the security extension feature bits in the processor feature
>>> - * registers as well. These are id_pfr1[7:4] and id_aa64pfr0[15:12].
>>> - */
>>> - cpu->isar.id_pfr1 &= ~0xf0;
>>> - cpu->isar.id_aa64pfr0 &= ~0xf000;
>>> + if (cpu->psci_conduit == QEMU_PSCI_CONDUIT_SMC) {
>>> + /*
>>> + * We tell the guest to use SMC calls into EL3 for PSCI calls, so
>>> + * there has to be EL3 available. We merely execute it on the host
>>> + * in QEMU rather than in actual EL3 inside the guest.
>>> + */
>>> + } else {
>>> + /*
>>> + * Disable the security extension feature bits in the processor
>>> + * feature registers as well. These are id_pfr1[7:4] and
>>> + * id_aa64pfr0[15:12].
>>> + */
>>> + cpu->isar.id_pfr1 &= ~0xf0;
>>> + cpu->isar.id_aa64pfr0 &= ~0xf000;
>>> + }
>> This is tricky, because we use the cpu->isar values to determine whether
>> we should be emulating things. So this change means we now create an
>> inconsistent CPU which in some ways claims to have EL3 (the ISAR ID
>> bits say so) and in some ways does not (the ARM_FEATURE_EL3 flag is
>> unset), and depending on which of the two "do we have EL3?" methods
>> any bit of the TCG code is using will give different results...
> Do you think it would be sufficient to go through all readers of the isar bits and guard them behind an ARM_FEATURE_EL3 check in addition? I'll be happy to do so then! :)
The aa32 pfr1 seems to have a single consumer:
static inline bool isar_feature_aa32_m_sec_state(const ARMISARegisters *id)
{
/*
* Return true if M-profile state handling insns
* (VSCCLRM, CLRM, FPCTX access insns) are implemented
*/
return FIELD_EX32(id->id_pfr1, ID_PFR1, SECURITY) >= 3;
}
which is only called for M profile. For M profile however, the patch is
irrelevant as it's patching inside a !arm_feature(env, ARM_FEATURE_M)
branch.
The only consumer of the AA64PFR.EL3 field I could find was in KVM code
when assembling -cpu host. It again is unaffected by this patch.
Alex
next prev parent reply other threads:[~2021-11-14 21:36 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-11-14 10:56 [PATCH] arm: Don't remove EL3 exposure for SMC conduit Alexander Graf
2021-11-14 17:20 ` Peter Maydell
2021-11-14 17:41 ` Alexander Graf
2021-11-14 21:35 ` Alexander Graf [this message]
2021-11-15 10:46 ` Peter Maydell
2021-11-15 11:38 ` Alexander Graf
2021-11-15 12:08 ` Alex Bennée
2021-11-15 12:54 ` Alexander Graf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=55997def-c09c-00c8-711a-50a2ac6e7576@csgraf.de \
--to=agraf@csgraf.de \
--cc=alex.bennee@linaro.org \
--cc=andrey.warkentin@gmail.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).