Page MenuHomeFreeBSD

D36296.id109671.diff
No OneTemporary

D36296.id109671.diff

Index: sys/arm64/arm64/cpufunc_asm.S
===================================================================
--- sys/arm64/arm64/cpufunc_asm.S
+++ sys/arm64/arm64/cpufunc_asm.S
@@ -143,6 +143,18 @@
ret
END(arm64_dic_idc_icache_sync_range)
+/*
+ * void arm64_idc_aliasing_icache_sync_range(vm_offset_t, vm_size_t)
+ * When the CTR_EL0.IDC bit is set cleaning to PoU becomes a dsb.
+ */
+ENTRY(arm64_idc_aliasing_icache_sync_range)
+ dsb ishst
+ ic ialluis
+ dsb ish
+ isb
+ ret
+END(arm64_idc_aliasing_icache_sync_range)
+
/*
* void arm64_aliasing_icache_sync_range(vm_offset_t, vm_size_t)
*/
Index: sys/arm64/arm64/identcpu.c
===================================================================
--- sys/arm64/arm64/identcpu.c
+++ sys/arm64/arm64/identcpu.c
@@ -1918,6 +1918,10 @@
arm64_icache_sync_range = &arm64_dic_idc_icache_sync_range;
if (bootverbose)
printf("Enabling DIC & IDC ICache sync\n");
+ } else if (idc) {
+ arm64_icache_sync_range = &arm64_idc_aliasing_icache_sync_range;
+ if (bootverbose)
+ printf("Enabling IDC ICache sync\n");
}
if ((elf_hwcap & HWCAP_ATOMICS) != 0) {
Index: sys/arm64/include/cpufunc.h
===================================================================
--- sys/arm64/include/cpufunc.h
+++ sys/arm64/include/cpufunc.h
@@ -241,6 +241,7 @@
void arm64_nullop(void);
void arm64_tlb_flushID(void);
void arm64_dic_idc_icache_sync_range(vm_offset_t, vm_size_t);
+void arm64_idc_aliasing_icache_sync_range(vm_offset_t, vm_size_t);
void arm64_aliasing_icache_sync_range(vm_offset_t, vm_size_t);
int arm64_icache_sync_range_checked(vm_offset_t, vm_size_t);
void arm64_dcache_wbinv_range(vm_offset_t, vm_size_t);

File Metadata

Mime Type
text/plain
Expires
Wed, Oct 7, 12:34 AM (14 h, 57 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
40326061
Default Alt Text
D36296.id109671.diff (1 KB)

Event Timeline