[PATCH v3 06/13] KVM: arm64: Use LPA2 page-tables for stage2 if HW supports it
Ryan Roberts
ryan.roberts at arm.com
Wed Sep 27 01:35:15 PDT 2023
On 27/09/2023 08:02, Oliver Upton wrote:
> On Mon, Sep 18, 2023 at 07:57:33AM +0100, Ryan Roberts wrote:
>
> [...]
>
>> static inline u64 kvm_pte_to_phys(kvm_pte_t pte)
>> {
>> - u64 pa = pte & KVM_PTE_ADDR_MASK;
>> -
>> - if (PAGE_SHIFT == 16)
>> - pa |= FIELD_GET(KVM_PTE_ADDR_51_48, pte) << 48;
>> + u64 pa;
>> +
>> + if (system_supports_lpa2()) {
>> + pa = pte & KVM_PTE_ADDR_MASK_LPA2;
>> + pa |= FIELD_GET(KVM_PTE_ADDR_51_50_LPA2, pte) << 50;
>> + } else {
>> + pa = pte & KVM_PTE_ADDR_MASK;
>> + if (PAGE_SHIFT == 16)
>> + pa |= FIELD_GET(KVM_PTE_ADDR_51_48, pte) << 48;
>> + }
>>
>> return pa;
>> }
>>
>> static inline kvm_pte_t kvm_phys_to_pte(u64 pa)
>> {
>> - kvm_pte_t pte = pa & KVM_PTE_ADDR_MASK;
>> -
>> - if (PAGE_SHIFT == 16) {
>> - pa &= GENMASK(51, 48);
>> - pte |= FIELD_PREP(KVM_PTE_ADDR_51_48, pa >> 48);
>> + kvm_pte_t pte;
>> +
>> + if (system_supports_lpa2()) {
>> + pte = pa & KVM_PTE_ADDR_MASK_LPA2;
>> + pa &= GENMASK(51, 50);
>> + pte |= FIELD_PREP(KVM_PTE_ADDR_51_50_LPA2, pa >> 50);
>> + } else {
>> + pte = pa & KVM_PTE_ADDR_MASK;
>> + if (PAGE_SHIFT == 16) {
>> + pa &= GENMASK(51, 48);
>> + pte |= FIELD_PREP(KVM_PTE_ADDR_51_48, pa >> 48);
>> + }
>> }
>
> These accessors are common between stage-1 and stage-2 walks... Aren't
> bits [9:8] of the descriptor still being used to encode shareability for
> hyp stage-1 at this point?
Yes, that's correct. I split the commits just to be able to see what changes are
in respect of which stage, although as you point out, this part is actually shared.
>
> You may as well squash the subsequent patch (LPA2 format for S1) into this
> one such that the change is atomic.
>
OK, I'll squash them in the next version.
More information about the linux-arm-kernel
mailing list