• James Hogan's avatar
    MIPS: Fix definition of KSEGX() for 64-bit · 6002bdd3
    James Hogan authored
    The KSEGX() macro is defined to 32-bit sign extend the address argument
    and logically AND the result with 0xe0000000, with the final result
    usually compared against one of the CKSEG macros. However the literal
    0xe0000000 is unsigned as the high bit is set, and is therefore
    zero-extended on 64-bit kernels, resulting in the sign extension bits of
    the argument being masked to zero. This results in the odd situation
    where:
    
      KSEGX(CKSEG) != CKSEG
      (0xffffffff80000000 & 0x00000000e0000000) != 0xffffffff80000000)
    
    Fix this by 32-bit sign extending the 0xe0000000 literal using
    _ACAST32_.
    
    This will help some MIPS KVM code handling 32-bit guest addresses to
    work on 64-bit host kernels, but will also affect KSEGX in
    dec_kn01_be_backend() on a 64-bit DECstation kernel, and the SiByte DMA
    page ops KSEGX check in clear_page() and copy_page() on 64-bit SB1
    kernels, neither of which appear to be designed with 64-bit segments in
    mind anyway.
    Signed-off-by: default avatarJames Hogan <james.hogan@imgtec.com>
    Acked-by: default avatarRalf Baechle <ralf@linux-mips.org>
    Cc: Maciej W. Rozycki <macro@linux-mips.org>
    Cc: linux-mips@linux-mips.org
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    6002bdd3
addrspace.h 4.13 KB