• Greg Ungerer's avatar
    m68knommu: fix trap on execing /bin/init · e95c3f7a
    Greg Ungerer authored
    As of commit fea82210 ("m68k: switch to saner kernel_execve() semantics")
    the non-mmu m68k targets have trapped on booting. The execing of /bin/init
    causes the exec path to try and return through a 0x0 return address - thus
    trapping or otherwise hanging or crashing.
    
    The problem isn't in the exec path as such though, but rather in the
    m68knommu start_thread() macro. It is trying to clear the a6 register that
    it assumes is part of a struct switch_stack below the thread registers on
    our stack. But that is not what the stack frames look like when this is run.
    So it ends up corrupting our call stack and zeroing out a function return
    address that is sitting there.
    
    The clearing of a6 was introduced many years ago in commit 7bf9a37d
    ("m68knommu: force stack alignment on ColdFire"). It used to work because
    the kernel init exec code path had a short cut back to the exception return
    code, and it didn't need to return through the calls on the stack.
    Signed-off-by: default avatarGreg Ungerer <gerg@uclinux.org>
    e95c3f7a
processor.h 4.33 KB