diff options
Diffstat (limited to 'arch/powerpc/lib/feature-fixups.c')
-rw-r--r-- | arch/powerpc/lib/feature-fixups.c | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/arch/powerpc/lib/feature-fixups.c b/arch/powerpc/lib/feature-fixups.c index e613b02bb2f0..5169cc805464 100644 --- a/arch/powerpc/lib/feature-fixups.c +++ b/arch/powerpc/lib/feature-fixups.c | |||
@@ -118,7 +118,7 @@ void do_feature_fixups(unsigned long value, void *fixup_start, void *fixup_end) | |||
118 | } | 118 | } |
119 | 119 | ||
120 | #ifdef CONFIG_PPC_BOOK3S_64 | 120 | #ifdef CONFIG_PPC_BOOK3S_64 |
121 | void do_stf_entry_barrier_fixups(enum stf_barrier_type types) | 121 | static void do_stf_entry_barrier_fixups(enum stf_barrier_type types) |
122 | { | 122 | { |
123 | unsigned int instrs[3], *dest; | 123 | unsigned int instrs[3], *dest; |
124 | long *start, *end; | 124 | long *start, *end; |
@@ -168,7 +168,7 @@ void do_stf_entry_barrier_fixups(enum stf_barrier_type types) | |||
168 | : "unknown"); | 168 | : "unknown"); |
169 | } | 169 | } |
170 | 170 | ||
171 | void do_stf_exit_barrier_fixups(enum stf_barrier_type types) | 171 | static void do_stf_exit_barrier_fixups(enum stf_barrier_type types) |
172 | { | 172 | { |
173 | unsigned int instrs[6], *dest; | 173 | unsigned int instrs[6], *dest; |
174 | long *start, *end; | 174 | long *start, *end; |
@@ -347,6 +347,29 @@ void do_barrier_nospec_fixups_range(bool enable, void *fixup_start, void *fixup_ | |||
347 | 347 | ||
348 | printk(KERN_DEBUG "barrier-nospec: patched %d locations\n", i); | 348 | printk(KERN_DEBUG "barrier-nospec: patched %d locations\n", i); |
349 | } | 349 | } |
350 | |||
351 | static void patch_btb_flush_section(long *curr) | ||
352 | { | ||
353 | unsigned int *start, *end; | ||
354 | |||
355 | start = (void *)curr + *curr; | ||
356 | end = (void *)curr + *(curr + 1); | ||
357 | for (; start < end; start++) { | ||
358 | pr_devel("patching dest %lx\n", (unsigned long)start); | ||
359 | patch_instruction(start, PPC_INST_NOP); | ||
360 | } | ||
361 | } | ||
362 | |||
363 | void do_btb_flush_fixups(void) | ||
364 | { | ||
365 | long *start, *end; | ||
366 | |||
367 | start = PTRRELOC(&__start__btb_flush_fixup); | ||
368 | end = PTRRELOC(&__stop__btb_flush_fixup); | ||
369 | |||
370 | for (; start < end; start += 2) | ||
371 | patch_btb_flush_section(start); | ||
372 | } | ||
350 | #endif /* CONFIG_PPC_FSL_BOOK3E */ | 373 | #endif /* CONFIG_PPC_FSL_BOOK3E */ |
351 | 374 | ||
352 | void do_lwsync_fixups(unsigned long value, void *fixup_start, void *fixup_end) | 375 | void do_lwsync_fixups(unsigned long value, void *fixup_start, void *fixup_end) |