diff options
author | Pavel Pisa <pisa@cmp.felk.cvut.cz> | 2016-07-17 18:21:48 +0200 |
---|---|---|
committer | Pavel Pisa <pisa@cmp.felk.cvut.cz> | 2016-10-02 10:40:34 +0200 |
commit | ae3578a2c9296d485e8eb395db46f8c84413604d (patch) | |
tree | 6892f1b3423ae12e79367a82d2c3a7194cd9e665 /c/src/lib/libcpu/arm/shared/include/arm-cp15.h | |
parent | libdl/rtl-obj.c: synchronize cache after code relocation. (diff) | |
download | rtems-ae3578a2c9296d485e8eb395db46f8c84413604d.tar.bz2 |
bsps/arm: do not disable MMU during translation table management operations.
Disabling MMU requires complex cache flushing and invalidation
operations. There is almost no way how to do that right
on SMP system without stopping all other CPUs. On the other hand,
there is documented sequence of operations which should be used
according to ARM manual and it guarantees even distribution
of maintenance operations to other cores for last generation
of Cortex-A cores with multiprocessor extension.
This change could require addition of appropriate entry
to arm_cp15_start_mmu_config_table for some BSPs to ensure
that MMU table stays accessible after MMU is enabled
{
.begin = (uint32_t) bsp_translation_table_base,
.end = (uint32_t) bsp_translation_table_base + 0x4000,
.flags = ARMV7_MMU_DATA_READ_WRITE_CACHED
}
Updates #2782
Updates #2783
Diffstat (limited to '')
-rw-r--r-- | c/src/lib/libcpu/arm/shared/include/arm-cp15.h | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/c/src/lib/libcpu/arm/shared/include/arm-cp15.h b/c/src/lib/libcpu/arm/shared/include/arm-cp15.h index ca7a11e673..52cca49441 100644 --- a/c/src/lib/libcpu/arm/shared/include/arm-cp15.h +++ b/c/src/lib/libcpu/arm/shared/include/arm-cp15.h @@ -560,6 +560,22 @@ arm_cp15_tlb_invalidate_entry(const void *mva) } ARM_CP15_TEXT_SECTION static inline void +arm_cp15_tlb_invalidate_entry_all_asids(const void *mva) +{ + ARM_SWITCH_REGISTERS; + + mva = ARM_CP15_TLB_PREPARE_MVA(mva); + + __asm__ volatile ( + ARM_SWITCH_TO_ARM + "mcr p15, 0, %[mva], c8, c7, 3\n" + ARM_SWITCH_BACK + : ARM_SWITCH_OUTPUT + : [mva] "r" (mva) + ); +} + +ARM_CP15_TEXT_SECTION static inline void arm_cp15_tlb_instruction_invalidate(void) { ARM_SWITCH_REGISTERS; |