• Marc Zyngier's avatar
    arm64: fixmap: fix missing sub-page offset for earlyprintk · f774b7d1
    Marc Zyngier authored
    Commit d57c33c5 (add generic fixmap.h) added (among other
    similar things) set_fixmap_io to deal with early ioremap of devices.
    
    More recently, commit bf4b558e (arm64: add early_ioremap support)
    converted the arm64 earlyprintk to use set_fixmap_io. A side effect of
    this conversion is that my virtual machines have stopped booting when
    I pass "earlyprintk=uart8250-8bit,0x3f8" to the guest kernel.
    
    Turns out that the new earlyprintk code doesn't care at all about
    sub-page offsets, and just assumes that the earlyprintk device will
    be page-aligned. Obviously, that doesn't play well with the above example.
    
    Further investigation shows that set_fixmap_io uses __set_fixmap instead
    of __set_fixmap_offset. A fix is to introduce a set_fixmap_offset_io that
    uses the latter, and to remove the superflous call to fix_to_virt
    (which only returns the value that set_fixmap_io has already given us).
    
    With this applied, my VMs are back in business. Tested on a Cortex-A57
    platform with kvmtool as platform emulation.
    
    Cc: Will Deacon <will.deacon@arm.com>
    Acked-by: default avatarMark Salter <msalter@redhat.com>
    Acked-by: default avatarArnd Bergmann <arnd@arndb.de>
    Signed-off-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
    Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    f774b7d1
early_printk.c 3.6 KB