mirror of
https://github.com/archr-linux/Arch-R.git
synced 2026-03-31 14:41:55 -07:00
see http://lists.infradead.org/pipermail/linux-rpi-kernel/2017-August/006884.html Signed-off-by: Matthias Reichl <hias@horus.com>
58 lines
1.4 KiB
Diff
58 lines
1.4 KiB
Diff
On Wed, 23 Aug 2017 17:42:14 +0200
|
|
Matthias Reichl <hias@horus.com> wrote:
|
|
|
|
> I haven't verified it myself but Phil Elwells first analysis here
|
|
> sounds plausible
|
|
>
|
|
> https://github.com/raspberrypi/linux/issues/2166#issuecomment-323355145
|
|
|
|
I noticed this comment:
|
|
|
|
"What makes this interesting (and is the reason this doesn't fail
|
|
normally) is that these functions are all called within kernel_init, so
|
|
the __ro_after_init attribute shouldn't have caused the variable to be
|
|
read-only yet."
|
|
|
|
When ftrace starts, it needs to set the kernel text to write, and when
|
|
it finishes it sets it back to readonly. But the kernel is not set to
|
|
readonly at boot up.
|
|
|
|
Can you test this patch? (Warning, I didn't even compile test it)
|
|
|
|
-- Steve
|
|
|
|
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c
|
|
index ad80548..fd75f38 100644
|
|
--- a/arch/arm/mm/init.c
|
|
+++ b/arch/arm/mm/init.c
|
|
@@ -745,19 +745,29 @@ static int __mark_rodata_ro(void *unused)
|
|
return 0;
|
|
}
|
|
|
|
+static int kernel_set_to_readonly;
|
|
+
|
|
void mark_rodata_ro(void)
|
|
{
|
|
+ kernel_set_to_readonly = 1;
|
|
+
|
|
stop_machine(__mark_rodata_ro, NULL, NULL);
|
|
}
|
|
|
|
void set_kernel_text_rw(void)
|
|
{
|
|
+ if (!kernel_set_to_readonly)
|
|
+ return;
|
|
+
|
|
set_section_perms(ro_perms, ARRAY_SIZE(ro_perms), false,
|
|
current->active_mm);
|
|
}
|
|
|
|
void set_kernel_text_ro(void)
|
|
{
|
|
+ if (!kernel_set_to_readonly)
|
|
+ return;
|
|
+
|
|
set_section_perms(ro_perms, ARRAY_SIZE(ro_perms), true,
|
|
current->active_mm);
|
|
}
|