Skip to contentSkip to conversation

i386: additional fix for making ioremap() accept 64-bit addresses

PATCH In review Jan Beulich 2 participants 3 messages Apr 4, 2008

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

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.

Cc H. Peter Anvin <[email protected]>
Cc Stefan Richter <[email protected]>
Cc Ingo Molnar <[email protected]>
Cc Thomas Gleixner <[email protected]>
---
 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(unsigned 
 static 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;
 
 	/*
#1 lore raw
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

#2 lore raw

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_MASK fix 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