Re: [PATCH v3 02/14] arm64: Detect if in a realm and set RIPAS RAM

From: Jean-Philippe Brucker
Date: Thu Jun 13 2024 - 06:51:15 EST


On Wed, Jun 12, 2024 at 11:59:22AM +0100, Suzuki K Poulose wrote:
> On 12/06/2024 11:40, Jean-Philippe Brucker wrote:
> > On Wed, Jun 05, 2024 at 10:29:54AM +0100, Steven Price wrote:
> > > From: Suzuki K Poulose <suzuki.poulose@xxxxxxx>
> > >
> > > Detect that the VM is a realm guest by the presence of the RSI
> > > interface.
> > >
> > > If in a realm then all memory needs to be marked as RIPAS RAM initially,
> > > the loader may or may not have done this for us. To be sure iterate over
> > > all RAM and mark it as such. Any failure is fatal as that implies the
> > > RAM regions passed to Linux are incorrect - which would mean failing
> > > later when attempting to access non-existent RAM.
> > >
> > > Signed-off-by: Suzuki K Poulose <suzuki.poulose@xxxxxxx>
> > > Co-developed-by: Steven Price <steven.price@xxxxxxx>
> > > Signed-off-by: Steven Price <steven.price@xxxxxxx>
> >
> > > +static bool rsi_version_matches(void)
> > > +{
> > > + unsigned long ver_lower, ver_higher;
> > > + unsigned long ret = rsi_request_version(RSI_ABI_VERSION,
> > > + &ver_lower,
> > > + &ver_higher);
> >
> > There is a regression on QEMU TCG (in emulation mode, not running under KVM):
> >
> > qemu-system-aarch64 -M virt -cpu max -kernel Image -nographic
> >
> > This doesn't implement EL3 or EL2, so SMC is UNDEFINED (DDI0487J.a R_HMXQS),
> > and we end up with an undef instruction exception. So this patch would
> > also break hardware that only implements EL1 (I don't know if it exists).
>
> Thanks for the report, Could we not check ID_AA64PFR0_EL1.EL3 >= 0 ? I
> think we do this for kvm-unit-tests, we need the same here.

Good point, it also fixes this case and is simpler. It assumes RMM doesn't
hide this field, but I can't think of a reason it would.

This command won't work anymore:

qemu-system-aarch64 -M virt,secure=on -cpu max -kernel Image -nographic

implements EL3 and SMC still treated as undef. QEMU has a special case for
starting at EL2 in this case, but I couldn't find what this is for.

Treating SMC as undef is correct because SCR_EL3.SMD resets to an
architectutally UNKNOWN value. But the architecture requires that the CPU
resets to the highest implemented exception level (DDI0487J.a R_JYLQV). So
in my opinion we can use the ID_AA64PFR0_EL1.EL3 field here, and breaking
this particular configuration is not a problem: users shouldn't expect
Linux to boot when EL3 is implemented and doesn't run a firmware.

Thanks,
Jean

>
>
> Suzuki
>
> >
> > The easiest fix is to detect the SMC conduit through the PSCI node in DT.
> > SMCCC helpers already do this, but we can't use them this early in the
> > boot. I tested adding an early probe to the PSCI driver to check this, see
> > attached patches.
> >
> > Note that we do need to test the conduit after finding a PSCI node,
> > because even though it doesn't implement EL2 in this configuration, QEMU
> > still accepts PSCI HVCs in order to support SMP.
> >
> > Thanks,
> > Jean
> >
>