[PATCH v16 00/45] arm64: Support for Arm CCA in KVM
Suzuki K Poulose
suzuki.poulose at arm.com
Wed Aug 12 05:18:43 PDT 2026
On 12/08/2026 11:35, Gavin Shan wrote:
> Hi Alper and Suzuki,
>
> On 8/12/26 4:04 PM, Suzuki K Poulose wrote:
>> Hi Alper, Gavin
>>
>> On 12/08/2026 04:25, Alper Gun wrote:
>>> On Tue, Aug 11, 2026 at 8:08 PM Gavin Shan <gshan at redhat.com> wrote:
>>>> As the following calltrace indicates, -EAGAIN is returned from tf-
>>>> rmm::update_ripas()
>>>> because true is returned from s2tte_drain_pending() for the S2TTE
>>>> corresponding to
>>>> IPA 0x80000000. Linux host received error (RMI_ERROR_RTT, level=3)
>>>> in ripas_change().
>>>> Upon this specific error and the IPA range [0x80000000 0x90000000],
>>>> find_map_level()
>>>> returns level of 2, and realm_create_rtt_levels() returns 0 without
>>>> populating any
>>>> RTTs. After that, rmi_rtt_set_ripas() is re-executed and the above
>>>> loop starts over
>>>> again.
>>>>
>>>> Linux host
>>>> ==========
>>>> kvm_arch_vcpu_ioctl_run // cca/host-v16
>>>> check_vcpu_requests
>>>> kvm_check_request
>>>> kvm_rec_handle_request
>>>> kvm_complete_ripas_change
>>>> realm_set_ipa_state
>>>> ripas_change
>>>> rmi_rtt_set_ripas
>>>> SMC_RMI_RTT_SET_RIPAS
>>>>
>>>> TF-RMM
>>>> ======
>>>> SMC_RMI_RTT_SET_RIPAS // tf-rmm/topics/rmm-
>>>> v2.0-poc_3
>>>> smc_rtt_set_ripas
>>>> s2tt_walk_lock_unlock
>>>> rtt_set_ripas_range
>>>> update_ripas
>>>> s2tte_drain_pending // true, returns -EAGAIN
>>>>
>>>> The problem is the pending-bit for RTE corresponding IPA address
>>>> 0x80000000 isn't cleared
>>>> when SMC_RMI_RTT_SET_RIPAS is invoked. I didn't figure out how this
>>>> bit is set and why
>>>> it's not cleared in time.
>>
>> Thanks for the details.
>>
>>>>
>>>
>>> Hi Gavin, Suzuki,
>>>
>>> I think I ran into a similar issue on rmm-v2.0-poc_3 last week.
>>> This looks like a potential RMM bug: could bit 32 be part of the
>>> physical
>>> Address (if PA >= 4 GiB)?
>>>
>>> It seems s2tte_drain_pending() in lib/s2tt/src/s2tt.c checks bit 32
>>> without
>>> checking whether the descriptor is valid or invalid.
>>>
>>> In my testing, guarding the drain checks with a check for
>>> S2TTE_INVALID seemed
>>> to resolve the boot hang:
>>> --- a/lib/s2tt/src/s2tt.c
>>> +++ b/lib/s2tt/src/s2tt.c
>>> @@ -1701,6 +1701,10 @@ unsigned long
>>> s2tte_clear_drain_pending(unsigned long s2tte)
>>>
>>> bool s2tte_drain_pending(unsigned long s2tte)
>>> {
>>> + if ((s2tte & S2TT_DESC_VALID_MASK) != S2TTE_INVALID) {
>>> + return false;
>>
>> We should use also consider cases where the entry is INVALID, but
>> has HIPAS=ASSIGNED/ASSIGNED_DEV to make it tighter. So, I think
>> it is better to use :
>>
>> s2tte_is_unassigned() or in the library stick to :
>>
>> if (!s2tte_has_hipas(s2tte, S2TTE_INVALID_HIPAS_UNASSIGNED))
>> return false;
>>
>> May be we should assert this and make the caller responsible for
>> checking the bit. I will leave it to the tf-RMM team to fix.
>>
>> But for now, please use the above fix.
>>
>
> Both worked for me. With the extra check in place, the realm guest can boot
> up successfully.
>
> FYI, The below additional checks in s2tte_tlbi_pending() and
> s2tte_drain_handle()
> aren't needed because they're always guarded by s2tte_drain_pending() in
> all
> calling sites.
fyi, the tf-RMM patch is out for review here : (Thanks Javier)
https://review.trustedfirmware.org/c/TF-RMM/tf-rmm/+/53531
Please feel free to cherry-pick that one
Cheers
Suzuki
More information about the linux-arm-kernel
mailing list