MM: virtual address debug
Add some (configurable) expensive sanity checking to catch wrong address translations on x86. - create linux/mmdebug.h file to be able include this file in asm headers to not get unsolvable loops in header files - __phys_addr on x86_32 became a function in ioremap.c since PAGE_OFFSET, is_vmalloc_addr and VMALLOC_* non-constasts are undefined if declared in page_32.h - add __phys_addr_const for initializing doublefault_tss.__cr3 Tested on 386, 386pae, x86_64 and x86_64 numa=fake=2. Contains Andi's enable numa virtual address debug patch. Signed-off-by: Jiri Slaby <jirislaby@gmail.com> Cc: Andi Kleen <andi@firstfloor.org> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
952f4a0a9b
commit
59ea746337
8 changed files with 62 additions and 17 deletions
|
@ -23,19 +23,27 @@
|
|||
|
||||
#ifdef CONFIG_X86_64
|
||||
|
||||
unsigned long __phys_addr(unsigned long x)
|
||||
{
|
||||
if (x >= __START_KERNEL_map)
|
||||
return x - __START_KERNEL_map + phys_base;
|
||||
return x - PAGE_OFFSET;
|
||||
}
|
||||
EXPORT_SYMBOL(__phys_addr);
|
||||
|
||||
static inline int phys_addr_valid(unsigned long addr)
|
||||
{
|
||||
return addr < (1UL << boot_cpu_data.x86_phys_bits);
|
||||
}
|
||||
|
||||
unsigned long __phys_addr(unsigned long x)
|
||||
{
|
||||
if (x >= __START_KERNEL_map) {
|
||||
x -= __START_KERNEL_map;
|
||||
VIRTUAL_BUG_ON(x >= KERNEL_IMAGE_SIZE);
|
||||
x += phys_base;
|
||||
} else {
|
||||
VIRTUAL_BUG_ON(x < PAGE_OFFSET);
|
||||
x -= PAGE_OFFSET;
|
||||
VIRTUAL_BUG_ON(system_state == SYSTEM_BOOTING ? x > MAXMEM :
|
||||
!phys_addr_valid(x));
|
||||
}
|
||||
return x;
|
||||
}
|
||||
EXPORT_SYMBOL(__phys_addr);
|
||||
|
||||
#else
|
||||
|
||||
static inline int phys_addr_valid(unsigned long addr)
|
||||
|
@ -43,6 +51,15 @@ static inline int phys_addr_valid(unsigned long addr)
|
|||
return 1;
|
||||
}
|
||||
|
||||
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)));
|
||||
return x - PAGE_OFFSET;
|
||||
}
|
||||
EXPORT_SYMBOL(__phys_addr);
|
||||
|
||||
#endif
|
||||
|
||||
int page_is_ram(unsigned long pagenr)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue