From b15ebbc9ea193cd943eff383e18ac86be7de7983 Mon Sep 17 00:00:00 2001 From: Matthias Reichl Date: Wed, 23 Aug 2017 19:33:30 +0200 Subject: [PATCH] RPi: add proposed upstream linux patch to fix ftrace on boot see http://lists.infradead.org/pipermail/linux-rpi-kernel/2017-August/006884.html Signed-off-by: Matthias Reichl --- .../linux/linux-06-fix-ftrace-on-boot.patch | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 projects/RPi/patches/linux/linux-06-fix-ftrace-on-boot.patch diff --git a/projects/RPi/patches/linux/linux-06-fix-ftrace-on-boot.patch b/projects/RPi/patches/linux/linux-06-fix-ftrace-on-boot.patch new file mode 100644 index 0000000000..991fd117f8 --- /dev/null +++ b/projects/RPi/patches/linux/linux-06-fix-ftrace-on-boot.patch @@ -0,0 +1,57 @@ +On Wed, 23 Aug 2017 17:42:14 +0200 +Matthias Reichl 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); + }