i386: additional fix for making ioremap() accept 64-bit addresses
PATCH 1/1 i386: additional fix for making ioremap() accept 64-bit addresses
The recent change to __ioremap()'s first parameter's type didn't yield the intended effect as the first conditional inside the function would still have filtered out any addresses with bits [63:32] set. Correct last_addr's type and at once also add a check that the address range doesn't extend into space hardware cannot support even theoretically.
--- arch/x86/mm/ioremap.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
arch/x86/mm/ioremap.c +3 -2
@@ -109,13 +109,14 @@ static int ioremap_change_attr(unsignedstatic void __iomem *__ioremap (resource_size_t phys_addr,unsigned long size,enum ioremap_mode mode) { -unsigned long pfn, offset, last_addr, vaddr; +unsigned long pfn, offset, vaddr; +resource_size_t last_addr;struct vm_struct *area;pgprot_t prot;/* Don't allow wraparound or zero size */ last_addr = phys_addr + size -1 ; -if (!size || last_addr < phys_addr) +if (!size || last_addr < phys_addr || last_addr > __PHYSICAL_MASK)return NULL ;/*
Quoted 5 lines · Jan Beulich
The recent change to __ioremap()'s first parameter's type didn't yield the intended effect as the first conditional inside the function would still have filtered out any addresses with bits [63:32] set. Correct last_addr's type and at once also add a check that the address range doesn't extend into space hardware cannot support even theoretically.
i fixed this in x86.git more than a week ago, see:
| Subject: x86: ioremap of 64-bit resource on 32-bit kernel fix | From: Ingo Molnar <[email protected]> | Date: Tue, 25 Mar 2008 08:31:17 +0100
but since 64-bit resources never worked on 32-bit and the initiator regression causing this discussion turned out to be something else, i delayed this fix as .26 material.
the PHYSICAL_MASK fix looks good as an additional check - could you please resend it against x86.git/latest which has my fix already?
Ingo
Re: [PATCH] i386: additional fix for making ioremap() accept64-bit addresses
Quoted 16 lines
Quoted 1 line
Quoted 1 line
Ingo Molnar <[email protected]> 04.04.08 14:55 >>>
Quoted 5 lines · Jan Beulich
The recent change to __ioremap()'s first parameter's type didn't yield the intended effect as the first conditional inside the function would still have filtered out any addresses with bits [63:32] set. Correct last_addr's type and at once also add a check that the address range doesn't extend into space hardware cannot support even theoretically.
i fixed this in x86.git more than a week ago, see:
| Subject: x86: ioremap of 64-bit resource on 32-bit kernel fix | From: Ingo Molnar <[email protected]> | Date: Tue, 25 Mar 2008 08:31:17 +0100
Quoted 6 lines
but since 64-bit resources never worked on 32-bit and the initiator regression causing this discussion turned out to be something else, i delayed this fix as .26 material.
the
PHYSICAL_MASKfix looks good as an additional check - could you please resend it against x86.git/latest which has my fix already?
No need to do this afaics: you've already got the better
if (!phys_addr_valid(phys_addr)) {
printk(KERN_WARNING "ioremap: invalid physical address %llx\n",
phys_addr);
WARN_ON_ONCE(1);
return NULL;
}in there. What needs fixing is that this returns 1 on 32-bits unconditionally, whereas the x86-64 definition should also be used for PAE (and the parameter type should also be resource_size_t).
Jan