Re: [PATCH v2 01/12] MIPS: Fix definition of KSEGX() for 64-bit

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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




[Index of Archives]     [Linux MIPS Home]     [LKML Archive]     [Linux ARM Kernel]     [Linux ARM]     [Linux]     [Git]     [Yosemite News]     [Linux SCSI]     [Linux Hams]

  Powered by Linux