Skip to content

Commit

Permalink
KVM: arm64: selftests: Explicitly set the page attrs to Inner-Shareable
Browse files Browse the repository at this point in the history
Atomic instructions such as 'ldset' in the guest have been observed to
cause an EL1 data abort with FSC 0x35 (IMPLEMENTATION DEFINED fault
(Unsupported Exclusive or Atomic access)) on Neoverse-N3.

Per DDI0487L.a B2.2.6, atomic instructions are only architecturally
guaranteed for Inner/Outer Shareable Normal Write-Back memory. For
anything else the behavior is IMPLEMENTATION DEFINED and can lose
atomicity, or, in this case, generate an abort.

It would appear that selftests sets up the stage-1 mappings as Non
Shareable, leading to the observed abort. Explicitly set the
Shareability field to Inner Shareable for non-LPA2 page tables. Note
that for the LPA2 page table format, translations for cacheable memory
inherit the shareability attribute of the PTW, i.e. TCR_ELx.SH{0,1}.

Suggested-by: Oliver Upton <oupton@google.com>
Signed-off-by: Raghavendra Rao Ananta <rananta@google.com>
Link: https://lore.kernel.org/r/20250405001042.1470552-3-rananta@google.com
[oliver: Rephrase changelog]
Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
  • Loading branch information
Raghavendra Rao Ananta authored and Oliver Upton committed Apr 6, 2025
1 parent d8d7839 commit c8631ea
Show file tree
Hide file tree
Showing 2 changed files with 4 additions and 0 deletions.
1 change: 1 addition & 0 deletions tools/testing/selftests/kvm/include/arm64/processor.h
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@
#define PMD_TYPE_TABLE BIT(1)
#define PTE_TYPE_PAGE BIT(1)

#define PTE_SHARED (UL(3) << 8) /* SH[1:0], inner shareable */
#define PTE_AF BIT(10)

#define PTE_ADDR_MASK(page_shift) GENMASK(47, (page_shift))
Expand Down
3 changes: 3 additions & 0 deletions tools/testing/selftests/kvm/lib/arm64/processor.c
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,9 @@ static void _virt_pg_map(struct kvm_vm *vm, uint64_t vaddr, uint64_t paddr,
}

pg_attr = PTE_AF | PTE_ATTRINDX(attr_idx) | PTE_TYPE_PAGE | PTE_VALID;
if (!use_lpa2_pte_format(vm))
pg_attr |= PTE_SHARED;

*ptep = addr_pte(vm, paddr, pg_attr);
}

Expand Down

0 comments on commit c8631ea

Please sign in to comment.