Le 16/09/2022 à 08:23, Benjamin Gray a écrit :
-static int do_patch_instruction(u32 *addr, ppc_inst_t instr)
+static int patch_text(void *dest, const void *src, size_t size, bool is_exec)
{
int err;
unsigned long flags;
- /*
- * During early early boot patch_instruction is called
- * when text_poke_area is not ready, but we still need
- * to allow patching. We just do the plain old patching
- */
+ /* Make sure we aren't patching a freed init section */
+ if (static_branch_likely(&init_mem_is_free) && init_section_contains(dest, 4))
+ return 0;
+
if (!static_branch_likely(&poking_init_done))
- return raw_patch_instruction(addr, instr);
+ return __patch_text(dest, src, size, is_exec, dest);
Test ordering looks odd. How can init_mem_is_free be true and
poking_init_done be false ?
local_irq_save(flags);
- err = __do_patch_instruction(addr, instr);
+ err = do_patch_text(dest, src, size, is_exec);
local_irq_restore(flags);
return err;
}