On Mon, Jul 11, 2016 at 09:23:40PM +0100, James Hogan wrote: > 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(CKSEG0) != CKSEG0 > (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 a couple of other > users: > > - KSEGX in dec_kn01_be_backend() on a 64-bit DECstation kernel. Maciej > has confirmed this is not a valid combination. > > - The SiByte DMA page ops KSEGX check in clear_page() and copy_page() on > 64-bit SB1 kernels, which appears not to be designed with 64-bit > segments in mind anyway. This would (perhaps unintentionally) have > always fallen back to the CPU copy on 64-bit kernels anyway, so we > make this explicit by making CONFIG_SIBYTE_DMA_PAGEOPS depend on > 32BIT, so the change of KSEGX behaviour can't break anything. > > Signed-off-by: James Hogan <james.hogan@xxxxxxxxxx> > Cc: Ralf Baechle <ralf@xxxxxxxxxxxxxx> > Cc: Maciej W. Rozycki <macro@xxxxxxxxxxxxxx> > Cc: linux-mips@xxxxxxxxxxxxxx Acked-by: Ralf Baechle <ralf@xxxxxxxxxxxxxx> Ralf