Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

KVM: arm64: selftests: Explicitly set the page attrs to Inner-Shareable

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>

authored by

Raghavendra Rao Ananta and committed by
Oliver Upton
c8631ea5 d8d78398

+4
+1
tools/testing/selftests/kvm/include/arm64/processor.h
··· 113 113 #define PMD_TYPE_TABLE BIT(1) 114 114 #define PTE_TYPE_PAGE BIT(1) 115 115 116 + #define PTE_SHARED (UL(3) << 8) /* SH[1:0], inner shareable */ 116 117 #define PTE_AF BIT(10) 117 118 118 119 #define PTE_ADDR_MASK(page_shift) GENMASK(47, (page_shift))
+3
tools/testing/selftests/kvm/lib/arm64/processor.c
··· 172 172 } 173 173 174 174 pg_attr = PTE_AF | PTE_ATTRINDX(attr_idx) | PTE_TYPE_PAGE | PTE_VALID; 175 + if (!use_lpa2_pte_format(vm)) 176 + pg_attr |= PTE_SHARED; 177 + 175 178 *ptep = addr_pte(vm, paddr, pg_attr); 176 179 } 177 180