Hi Angelo, Thanks for your patch! On Thu, Jun 25, 2020 at 1:28 AM Angelo Dureghello <angelo.dureghello@xxxxxxxxxxx> wrote:
On mcf5441x, mmu enabled, using a small initramfs, the boot was recently hanging silently in the initial phase, inside arch/m68k/mm/init.c, m68k_setup_node() initrd at 0x47d2f000:0x47d82f64 overlap at 1073741889 for chunk 0 overlap at 1073746176 for chunk 0 overlap at 1073746736 for chunk 0 overlap at 1073746737 for chunk 0 overlap at 1073746738 for chunk 0 overlap at 1073746739 for chunk 0 overlap at 1073746740 for chunk 0 From some debugging, at m68k_setup_node(), the 25-bits shift value (virt_to_node_shift) seems unset, because applied to a wrong address (address previously set from m68k_fixup). Tried some fixes, but the more low-risk and hopefully correct seems to just add a volatile inside __virt_to_node_shift(). This seems to produce correct addresses for the next fixup to work. Cannot test this on other mmu ColdFire cpu's so every test is eventually welcome. Signed-off-by: Angelo Dureghello <angelo.dureghello@xxxxxxxxxxx>
--- a/arch/m68k/include/asm/page_mm.h +++ b/arch/m68k/include/asm/page_mm.h @@ -135,7 +135,7 @@ static inline __attribute_const__ int __virt_to_node_shift(void) { int shift; - asm ( + asm volatile ( "1: moveq #0,%0\n" m68k_fixup(%c1, 1b) : "=d" (shift)
Perhaps we should add the volatile to the other asm statements, too? Andreas? Which compiler version are you using? Have you compared the difference in generated code? With gcc version 8.4.0 (Ubuntu 8.4.0-1ubuntu1~18.04), the above makes no difference for m68k_setup_node(), and the compiler doesn't even optimize away the call to __virt_to_node_shift(), which is marked __attribute_const__. Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@xxxxxxxxxxxxxx In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds