MIPS: Fix definition of KSEGX() for 64-bit
authorJames Hogan <james.hogan@imgtec.com>
Fri, 8 Jul 2016 10:53:20 +0000 (11:53 +0100)
committerPaolo Bonzini <pbonzini@redhat.com>
Mon, 1 Aug 2016 16:42:20 +0000 (18:42 +0200)
commit6002bdd3e6688954f5f5c1d71b83862cfd7387d9
tree494c903bf319fa980d6f1ffc99aa013b27282f8f
parentb80c76ec982c00f2a15668ed71c1d705b6ff95fd
MIPS: Fix definition of KSEGX() for 64-bit

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: James Hogan <james.hogan@imgtec.com>
Acked-by: Ralf Baechle <ralf@linux-mips.org>
Cc: Maciej W. Rozycki <macro@linux-mips.org>
Cc: linux-mips@linux-mips.org
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/mips/include/asm/addrspace.h
This page took 0.029167 seconds and 5 git commands to generate.