Lines Matching +full:value +full:- +full:start
1 // SPDX-License-Identifier: GPL-2.0-or-later
19 #include <asm/code-patching.h>
30 unsigned long value; member
41 * the start of the alt_entry, to support the VDSO. This in calc_addr()
70 static int patch_feature_section_mask(unsigned long value, unsigned long mask, in patch_feature_section_mask() argument
73 u32 *start, *end, *alt_start, *alt_end, *src, *dest; in patch_feature_section_mask() local
75 start = calc_addr(fcur, fcur->start_off); in patch_feature_section_mask()
76 end = calc_addr(fcur, fcur->end_off); in patch_feature_section_mask()
77 alt_start = calc_addr(fcur, fcur->alt_start_off); in patch_feature_section_mask()
78 alt_end = calc_addr(fcur, fcur->alt_end_off); in patch_feature_section_mask()
80 if ((alt_end - alt_start) > (end - start)) in patch_feature_section_mask()
83 if ((value & fcur->mask & mask) == (fcur->value & mask)) in patch_feature_section_mask()
87 dest = start; in patch_feature_section_mask()
101 static void do_feature_fixups_mask(unsigned long value, unsigned long mask, in do_feature_fixups_mask() argument
110 if (patch_feature_section_mask(value, mask, fcur)) { in do_feature_fixups_mask()
112 printk("Unable to patch feature section at %p - %p" \ in do_feature_fixups_mask()
113 " with %p - %p\n", in do_feature_fixups_mask()
114 calc_addr(fcur, fcur->start_off), in do_feature_fixups_mask()
115 calc_addr(fcur, fcur->end_off), in do_feature_fixups_mask()
116 calc_addr(fcur, fcur->alt_start_off), in do_feature_fixups_mask()
117 calc_addr(fcur, fcur->alt_end_off)); in do_feature_fixups_mask()
122 void do_feature_fixups(unsigned long value, void *fixup_start, void *fixup_end) in do_feature_fixups() argument
124 do_feature_fixups_mask(value, ~0, fixup_start, fixup_end); in do_feature_fixups()
134 static int do_patch_fixups(long *start, long *end, unsigned int *instrs, int num) in do_patch_fixups() argument
138 for (i = 0; start < end; start++, i++) { in do_patch_fixups()
140 unsigned int *dest = (void *)start + *start; in do_patch_fixups()
155 static int do_patch_entry_fixups(long *start, long *end, unsigned int *instrs, in do_patch_entry_fixups() argument
160 for (i = 0; start < end; start++, i++) { in do_patch_entry_fixups()
161 unsigned int *dest = (void *)start + *start; in do_patch_entry_fixups()
185 long *start, *end; in do_stf_entry_barrier_fixups() local
188 start = PTRRELOC(&__start___stf_entry_barrier_fixup); in do_stf_entry_barrier_fixups()
208 i = do_patch_entry_fixups(start, end, instrs, types & STF_BARRIER_FALLBACK, in do_stf_entry_barrier_fixups()
211 printk(KERN_DEBUG "stf-barrier: patched %d entry locations (%s barrier)\n", i, in do_stf_entry_barrier_fixups()
222 long *start, *end; in do_stf_exit_barrier_fixups() local
225 start = PTRRELOC(&__start___stf_exit_barrier_fixup); in do_stf_exit_barrier_fixups()
255 i = do_patch_fixups(start, end, instrs, ARRAY_SIZE(instrs)); in do_stf_exit_barrier_fixups()
257 printk(KERN_DEBUG "stf-barrier: patched %d exit locations (%s barrier)\n", i, in do_stf_exit_barrier_fixups()
282 * The call to the fallback entry flush, and the fallback/sync-ori exit in do_stf_barrier_fixups()
288 * The branch to mark interrupt exits non-reentrant is enabled first, in do_stf_barrier_fixups()
314 long *start, *end; in do_uaccess_flush_fixups() local
317 start = PTRRELOC(&__start___uaccess_flush_fixup); in do_uaccess_flush_fixups()
339 i = do_patch_fixups(start, end, instrs, ARRAY_SIZE(instrs)); in do_uaccess_flush_fixups()
341 printk(KERN_DEBUG "uaccess-flush: patched %d locations (%s flush)\n", i, in do_uaccess_flush_fixups()
355 long *start, *end; in __do_entry_flush_fixups() local
384 * - the mflr (dest) in __do_entry_flush_fixups()
385 * - the mtlr (dest + 2) in __do_entry_flush_fixups()
386 * - the branch (dest + 1) in __do_entry_flush_fixups()
394 * - the branch (dest + 1) in __do_entry_flush_fixups()
395 * - the mtlr (dest + 2) in __do_entry_flush_fixups()
396 * - the mflr (dest) in __do_entry_flush_fixups()
399 * semi-patched state. in __do_entry_flush_fixups()
402 start = PTRRELOC(&__start___entry_flush_fixup); in __do_entry_flush_fixups()
404 i = do_patch_entry_fixups(start, end, instrs, types == L1D_FLUSH_FALLBACK, in __do_entry_flush_fixups()
407 start = PTRRELOC(&__start___scv_entry_flush_fixup); in __do_entry_flush_fixups()
409 i += do_patch_entry_fixups(start, end, instrs, types == L1D_FLUSH_FALLBACK, in __do_entry_flush_fixups()
412 printk(KERN_DEBUG "entry-flush: patched %d locations (%s flush)\n", i, in __do_entry_flush_fixups()
439 long *start, *end; in __do_rfi_flush_fixups() local
442 start = PTRRELOC(&__start___rfi_flush_fixup); in __do_rfi_flush_fixups()
462 i = do_patch_fixups(start, end, instrs, ARRAY_SIZE(instrs)); in __do_rfi_flush_fixups()
464 printk(KERN_DEBUG "rfi-flush: patched %d locations (%s flush)\n", i, in __do_rfi_flush_fixups()
505 long *start, *end; in do_barrier_nospec_fixups_range() local
508 start = fixup_start; in do_barrier_nospec_fixups_range()
514 pr_info("barrier-nospec: using ORI speculation barrier\n"); in do_barrier_nospec_fixups_range()
518 i = do_patch_fixups(start, end, &instr, 1); in do_barrier_nospec_fixups_range()
520 printk(KERN_DEBUG "barrier-nospec: patched %d locations\n", i); in do_barrier_nospec_fixups_range()
528 void *start, *end; in do_barrier_nospec_fixups() local
530 start = PTRRELOC(&__start___barrier_nospec_fixup); in do_barrier_nospec_fixups()
533 do_barrier_nospec_fixups_range(enable, start, end); in do_barrier_nospec_fixups()
541 long *start, *end; in do_barrier_nospec_fixups_range() local
544 start = fixup_start; in do_barrier_nospec_fixups_range()
551 pr_info("barrier-nospec: using isync; sync as speculation barrier\n"); in do_barrier_nospec_fixups_range()
556 i = do_patch_fixups(start, end, instr, ARRAY_SIZE(instr)); in do_barrier_nospec_fixups_range()
558 printk(KERN_DEBUG "barrier-nospec: patched %d locations\n", i); in do_barrier_nospec_fixups_range()
563 unsigned int *start, *end; in patch_btb_flush_section() local
565 start = (void *)curr + *curr; in patch_btb_flush_section()
567 for (; start < end; start++) { in patch_btb_flush_section()
568 pr_devel("patching dest %lx\n", (unsigned long)start); in patch_btb_flush_section()
569 patch_instruction(start, ppc_inst(PPC_RAW_NOP())); in patch_btb_flush_section()
575 long *start, *end; in do_btb_flush_fixups() local
577 start = PTRRELOC(&__start__btb_flush_fixup); in do_btb_flush_fixups()
580 for (; start < end; start += 2) in do_btb_flush_fixups()
581 patch_btb_flush_section(start); in do_btb_flush_fixups()
585 void do_lwsync_fixups(unsigned long value, void *fixup_start, void *fixup_end) in do_lwsync_fixups() argument
587 long *start, *end; in do_lwsync_fixups() local
590 if (!(value & CPU_FTR_LWSYNC)) in do_lwsync_fixups()
593 start = fixup_start; in do_lwsync_fixups()
596 for (; start < end; start++) { in do_lwsync_fixups()
597 dest = (void *)start + *start; in do_lwsync_fixups()
613 end = (void *)src + (__end_interrupts - _stext); in do_final_fixups()
634 *PTRRELOC(&saved_cpu_features) = spec->cpu_features; in apply_feature_fixups()
635 *PTRRELOC(&saved_mmu_features) = spec->mmu_features; in apply_feature_fixups()
638 * Apply the CPU-specific and firmware specific fixups to kernel text in apply_feature_fixups()
641 do_feature_fixups(spec->cpu_features, in apply_feature_fixups()
645 do_feature_fixups(spec->mmu_features, in apply_feature_fixups()
649 do_lwsync_fixups(spec->cpu_features, in apply_feature_fixups()
664 saved_mmu_features |= cur_cpu_spec->mmu_features & mask; in update_mmu_feature_fixups()
666 do_feature_fixups_mask(cur_cpu_spec->mmu_features, mask, in update_mmu_feature_fixups()
686 WARN(saved_cpu_features != cur_cpu_spec->cpu_features, in check_features()
688 WARN(saved_mmu_features != cur_cpu_spec->mmu_features, in check_features()
702 if (!(x)) printk("feature-fixups: test failed at line %d\n", __LINE__);
704 static int patch_feature_section(unsigned long value, struct fixup_entry *fcur) in patch_feature_section() argument
706 return patch_feature_section_mask(value, ~0, fcur); in patch_feature_section()
714 return (unsigned long)p - (unsigned long)entry; in calc_offset()
723 int size = 4 * (end_ftr_fixup_test1 - ftr_fixup_test1); in test_basic_patching()
725 fixup.value = fixup.mask = 8; in test_basic_patching()
733 /* Check we don't patch if the value matches */ in test_basic_patching()
737 /* Check we do patch if the value doesn't match */ in test_basic_patching()
755 int size = 4 * (end_ftr_fixup_test2 - ftr_fixup_test2); in test_alternative_patching()
757 fixup.value = fixup.mask = 0xF; in test_alternative_patching()
766 /* Check we don't patch if the value matches */ in test_alternative_patching()
770 /* Check we do patch if the value doesn't match */ in test_alternative_patching()
787 int size = 4 * (end_ftr_fixup_test3 - ftr_fixup_test3); in test_alternative_case_too_big()
789 fixup.value = fixup.mask = 0xC; in test_alternative_case_too_big()
814 int size = 4 * (end_ftr_fixup_test4 - ftr_fixup_test4); in test_alternative_case_too_small()
817 /* Check a high-bit flag */ in test_alternative_case_too_small()
818 flag = 1UL << ((sizeof(unsigned long) - 1) * 8); in test_alternative_case_too_small()
819 fixup.value = fixup.mask = flag; in test_alternative_case_too_small()
828 /* Check we don't patch if the value matches */ in test_alternative_case_too_small()
832 /* Check we do patch if the value doesn't match */ in test_alternative_case_too_small()
848 int size = 4 * (end_ftr_fixup_test5 - ftr_fixup_test5); in test_alternative_case_with_branch()
858 int size = 4 * (end_ftr_fixup_test6 - ftr_fixup_test6); in test_alternative_case_with_external_branch()
868 int size = 4 * (end_ftr_fixup_test7 - ftr_fixup_test7); in test_alternative_case_with_branch_to_end()
877 unsigned long size = ftr_fixup_test_FTR_macros_expected - in test_cpu_macros()
890 unsigned long size = ftr_fixup_test_FW_FTR_macros_expected - in test_fw_macros()
905 unsigned long size = end_lwsync_fixup_test - in test_lwsync_macros()
909 if (cur_cpu_spec->cpu_features & CPU_FTR_LWSYNC) { in test_lwsync_macros()
925 int size = sizeof(unsigned int) * (end_ftr_fixup_prefix1 - ftr_fixup_prefix1); in test_prefix_patching()
927 fixup.value = fixup.mask = 8; in test_prefix_patching()
947 int size = sizeof(unsigned int) * (end_ftr_fixup_prefix2 - ftr_fixup_prefix2); in test_prefix_alt_patching()
949 fixup.value = fixup.mask = 8; in test_prefix_alt_patching()
969 int size = sizeof(unsigned int) * (end_ftr_fixup_prefix3 - ftr_fixup_prefix3); in test_prefix_word_alt_patching()
971 fixup.value = fixup.mask = 8; in test_prefix_word_alt_patching()
992 printk(KERN_DEBUG "Running feature fixup self-tests ...\n"); in test_feature_fixups()