diff --git a/repos/base-hw/src/core/include/spec/arm_v7/cpu_support.h b/repos/base-hw/src/core/include/spec/arm_v7/cpu_support.h index 09406ebe3..0704103c3 100644 --- a/repos/base-hw/src/core/include/spec/arm_v7/cpu_support.h +++ b/repos/base-hw/src/core/include/spec/arm_v7/cpu_support.h @@ -224,6 +224,7 @@ class Genode::Arm_v7 : public Arm access_t v = 0; init_common(v); Arm::Sctlr::init_virt_kernel(v); + Z::set(v, 1); return v; } @@ -264,6 +265,12 @@ class Genode::Arm_v7 : public Arm } }; + /** + * Invalidate all branch predictions + */ + static void inval_branch_predicts() { + asm volatile ("mcr p15, 0, r0, c7, c5, 6" ::: "r0"); }; + /** * Switch to the virtual mode in kernel * @@ -278,6 +285,7 @@ class Genode::Arm_v7 : public Arm Ttbr0::write(Ttbr0::init(table)); Ttbcr::write(Ttbcr::init_virt_kernel()); Sctlr::write(Sctlr::init_virt_kernel()); + inval_branch_predicts(); } inline static void finish_init_phys_kernel(); diff --git a/repos/base-hw/src/core/include/spec/cortex_a15/cpu.h b/repos/base-hw/src/core/include/spec/cortex_a15/cpu.h index 05163738f..ca2ff7e19 100644 --- a/repos/base-hw/src/core/include/spec/cortex_a15/cpu.h +++ b/repos/base-hw/src/core/include/spec/cortex_a15/cpu.h @@ -59,7 +59,7 @@ class Genode::Cpu : public Arm_v7 ** Dummies ** *************/ - static void tlb_insertions() { } + static void tlb_insertions() { inval_branch_predicts(); } static void translation_added(addr_t, size_t) { } static void prepare_proceeding(Cpu_lazy_state *, Cpu_lazy_state *) { } }; diff --git a/repos/base-hw/src/core/include/spec/cortex_a9/cpu.h b/repos/base-hw/src/core/include/spec/cortex_a9/cpu.h index 8c2a8cb3f..86b6fa9cb 100644 --- a/repos/base-hw/src/core/include/spec/cortex_a9/cpu.h +++ b/repos/base-hw/src/core/include/spec/cortex_a9/cpu.h @@ -303,7 +303,7 @@ class Genode::Cpu : public Arm_v7 *************/ static void translation_added(addr_t, size_t) { } - static void tlb_insertions() { } + static void tlb_insertions() { inval_branch_predicts(); } }; void Genode::Arm_v7::finish_init_phys_kernel() { Cpu::init_advanced_fp_simd(); }