Christophe Leroy christophe.leroy@c-s.fr writes:
[Backport of upstream commit b45ba4a51cde29b2939365ef0c07ad34c8321789]
On powerpc32, patch_instruction() is called by apply_feature_fixups() which is called from early_init()
There is the following note in front of early_init():
- Note that the kernel may be running at an address which is different
- from the address that it was linked at, so we must use RELOC/PTRRELOC
- to access static data (including strings). -- paulus
Therefore init_mem_is_free must be accessed with PTRRELOC()
Fixes: 1c38a84d4586 ("powerpc: Avoid code patching freed init sections") Link: https://bugzilla.kernel.org/show_bug.cgi?id=203597 Signed-off-by: Christophe Leroy christophe.leroy@c-s.fr
Can't apply the upstream commit as such due to several of other unrelated stuff like STRICT_KERNEL_RWX which are missing for instance. So instead, using same approach as for commit 252eb55816a6f69ef9464cad303cdb3326cdc61d
Yeah this looks good to me.
Though should we keep the same subject as the upstream commit this is sort of a backport of? That might make it simpler for people who are trying to keep track of things?
ie. "powerpc/lib: fix book3s/32 boot failure due to code patching"
cheers
diff --git a/arch/powerpc/lib/code-patching.c b/arch/powerpc/lib/code-patching.c index 14535ad4cdd1..c312955977ce 100644 --- a/arch/powerpc/lib/code-patching.c +++ b/arch/powerpc/lib/code-patching.c @@ -23,7 +23,7 @@ int patch_instruction(unsigned int *addr, unsigned int instr) int err; /* Make sure we aren't patching a freed init section */
- if (init_mem_is_free && init_section_contains(addr, 4)) {
- if (*PTRRELOC(&init_mem_is_free) && init_section_contains(addr, 4)) { pr_debug("Skipping init section patching addr: 0x%px\n", addr); return 0; }
-- 2.13.3
linux-stable-mirror@lists.linaro.org