• Geert Uytterhoeven's avatar
    m68k: Fix memblock-related crashes · bed1369f
    Geert Uytterhoeven authored
    When running the kernel in Fast RAM on Atari:
    
        Ignoring memory chunk at 0x0:0xe00000 before the first chunk
        ...
        Unable to handle kernel NULL pointer dereference at virtual address (ptrval)
        Oops: 00000000
        Modules linked in:
        PC: [<0069dbac>] free_all_bootmem+0x12c/0x186
        SR: 2714  SP: (ptrval)  a2: 005e3314
        d0: 00000000    d1: 0000000a    d2: 00000e00    d3: 00000000
        d4: 005e1fc0    d5: 0000001a    a0: 01000000    a1: 00000000
        Process swapper (pid: 0, task=(ptrval))
        Frame format=7 eff addr=00000736 ssw=0505 faddr=00000736
        wb 1 stat/addr/data: 0000 00000000 00000000
        wb 2 stat/addr/data: 0000 00000000 00000000
        wb 3 stat/addr/data: 0000 00000736 00000000
        push data: 00000000 00000000 00000000 00000000
        Stack from 005e1f84:
                00000000 0000000a 027d3260 006b5006 00000000 00000000 00000000 00000000
                0004f062 0003a220 0069e272 005e1ff8 0000054c 00000000 00e00000 00000000
                00000001 00693cd8 027d3260 0004f062 0003a220 00691be6 00000000 00000000
                00000000 00000000 00000000 00000000 006b5006 00000000 00690872
        Call Trace: [<0004f062>] printk+0x0/0x18
         [<0003a220>] parse_args+0x0/0x2d4
         [<0069e272>] memblock_virt_alloc_try_nid+0x0/0xa4
         [<00693cd8>] mem_init+0xa/0x5c
         [<0004f062>] printk+0x0/0x18
         [<0003a220>] parse_args+0x0/0x2d4
         [<00691be6>] start_kernel+0x1ca/0x462
         [<00690872>] _sinittext+0x872/0x11f8
        Code: 7a1a eaae 2270 6db0 0061 ef14 2f01 2f03 <96a9> 0736 2203 e589 d681 e78b d6a9 0732 2f03 2f40 0034 4eb9 0069 b8d0 260e 4fef
        Disabling lock debugging due to kernel taint
        Kernel panic - not syncing: Attempted to kill the idle task!
    
    As the kernel must run in the memory chunk with the lowest address,
    ST-RAM is ignored, and removed from the m68k_memory[] array.
    However, it is not removed from memblock, causing a crash later.
    
    More investigation shows that there are 3 places where memory chunks are
    ignored, all after the calls to memblock_add() in m68k_parse_bootinfo(),
    and thus causing crashes:
      1. On classic m68k CPUs with a MMU, paging_init() ignores all memory
         chunks below the first chunk, cfr. above,
      2. On Amigas equipped with a Zorro III bus, config_amiga() ignores all
         Zorro II memory,
      3. If CONFIG_SINGLE_MEMORY_CHUNK=y, m68k_parse_bootinfo() ignores all
         but the first memory chunk.
    
    Fix this by moving the calls to memblock_add() from
    m68k_parse_bootinfo() to paging_init(), after all ignored memory chunks
    have been removed from m68k_memory[].
    Reported-by: default avatarAndreas Schwab <schwab@linux-m68k.org>
    Fixes: 1008a115 ("m68k: switch to MEMBLOCK + NO_BOOTMEM")
    Signed-off-by: default avatarGeert Uytterhoeven <geert@linux-m68k.org>
    bed1369f
setup_mm.c 12.7 KB