Skip to content

Commit c8631ea

Browse files
rananta468oupton
authored andcommitted
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 <[email protected]> Signed-off-by: Raghavendra Rao Ananta <[email protected]> Link: https://lore.kernel.org/r/[email protected] [oliver: Rephrase changelog] Signed-off-by: Oliver Upton <[email protected]>
1 parent d8d7839 commit c8631ea

File tree

2 files changed

+4
-0
lines changed

2 files changed

+4
-0
lines changed

tools/testing/selftests/kvm/include/arm64/processor.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@
113113
#define PMD_TYPE_TABLE BIT(1)
114114
#define PTE_TYPE_PAGE BIT(1)
115115

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

118119
#define PTE_ADDR_MASK(page_shift) GENMASK(47, (page_shift))

tools/testing/selftests/kvm/lib/arm64/processor.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,9 @@ static void _virt_pg_map(struct kvm_vm *vm, uint64_t vaddr, uint64_t paddr,
172172
}
173173

174174
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+
175178
*ptep = addr_pte(vm, paddr, pg_attr);
176179
}
177180

0 commit comments

Comments
 (0)