x86: fix virt_addr_valid() with CONFIG_DEBUG_VIRTUAL=y, v2
virt_addr_valid() calls __pa(), which calls __phys_addr(). With CONFIG_DEBUG_VIRTUAL=y, __phys_addr() will kill the kernel if the address *isn't* valid. That's clearly wrong for virt_addr_valid(). We also incorporate the debugging checks into virt_addr_valid(). Signed-off-by: Vegard Nossum <vegardno@ben.ifi.uio.no> Acked-by: Jiri Slaby <jirislaby@gmail.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:

committed by
Ingo Molnar

parent
7f2f49a582
commit
af5c2bd16a
@@ -45,6 +45,27 @@ unsigned long __phys_addr(unsigned long x)
|
||||
}
|
||||
EXPORT_SYMBOL(__phys_addr);
|
||||
|
||||
bool __virt_addr_valid(unsigned long x)
|
||||
{
|
||||
if (x >= __START_KERNEL_map) {
|
||||
x -= __START_KERNEL_map;
|
||||
if (x >= KERNEL_IMAGE_SIZE)
|
||||
return false;
|
||||
x += phys_base;
|
||||
} else {
|
||||
if (x < PAGE_OFFSET)
|
||||
return false;
|
||||
x -= PAGE_OFFSET;
|
||||
if (system_state == SYSTEM_BOOTING ?
|
||||
x > MAXMEM : !phys_addr_valid(x)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return pfn_valid(x >> PAGE_SHIFT);
|
||||
}
|
||||
EXPORT_SYMBOL(__virt_addr_valid);
|
||||
|
||||
#else
|
||||
|
||||
static inline int phys_addr_valid(unsigned long addr)
|
||||
@@ -56,13 +77,24 @@ static inline int phys_addr_valid(unsigned long addr)
|
||||
unsigned long __phys_addr(unsigned long x)
|
||||
{
|
||||
/* VMALLOC_* aren't constants; not available at the boot time */
|
||||
VIRTUAL_BUG_ON(x < PAGE_OFFSET || (system_state != SYSTEM_BOOTING &&
|
||||
is_vmalloc_addr((void *)x)));
|
||||
VIRTUAL_BUG_ON(x < PAGE_OFFSET);
|
||||
VIRTUAL_BUG_ON(system_state != SYSTEM_BOOTING &&
|
||||
is_vmalloc_addr((void *) x));
|
||||
return x - PAGE_OFFSET;
|
||||
}
|
||||
EXPORT_SYMBOL(__phys_addr);
|
||||
#endif
|
||||
|
||||
bool __virt_addr_valid(unsigned long x)
|
||||
{
|
||||
if (x < PAGE_OFFSET)
|
||||
return false;
|
||||
if (system_state != SYSTEM_BOOTING && is_vmalloc_addr((void *) x))
|
||||
return false;
|
||||
return pfn_valid((x - PAGE_OFFSET) >> PAGE_SHIFT);
|
||||
}
|
||||
EXPORT_SYMBOL(__virt_addr_valid);
|
||||
|
||||
#endif
|
||||
|
||||
int page_is_ram(unsigned long pagenr)
|
||||
|
Reference in New Issue
Block a user