x86: split __phys_addr out into separate file
Split __phys_addr out into its own file so we can disable -fstack-protector in a fine-grained fashion. Also it doesn't have terribly much to do with the rest of ioremap.c. Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
This commit is contained in:
parent
2496afbf1e
commit
78c86e5e56
4 changed files with 83 additions and 73 deletions
|
@ -1,9 +1,9 @@
|
|||
obj-y := init.o init_$(BITS).o fault.o ioremap.o extable.o pageattr.o mmap.o \
|
||||
pat.o pgtable.o gup.o
|
||||
pat.o pgtable.o physaddr.o gup.o
|
||||
|
||||
# Make sure __phys_addr has no stackprotector
|
||||
nostackp := $(call cc-option, -fno-stack-protector)
|
||||
CFLAGS_ioremap.o := $(nostackp)
|
||||
CFLAGS_physaddr.o := $(nostackp)
|
||||
|
||||
obj-$(CONFIG_SMP) += tlb.o
|
||||
|
||||
|
|
|
@ -22,77 +22,7 @@
|
|||
#include <asm/pgalloc.h>
|
||||
#include <asm/pat.h>
|
||||
|
||||
static inline int phys_addr_valid(resource_size_t addr)
|
||||
{
|
||||
#ifdef CONFIG_PHYS_ADDR_T_64BIT
|
||||
return !(addr >> boot_cpu_data.x86_phys_bits);
|
||||
#else
|
||||
return 1;
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
|
||||
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(!phys_addr_valid(x));
|
||||
}
|
||||
return 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 (!phys_addr_valid(x))
|
||||
return false;
|
||||
}
|
||||
|
||||
return pfn_valid(x >> PAGE_SHIFT);
|
||||
}
|
||||
EXPORT_SYMBOL(__virt_addr_valid);
|
||||
|
||||
#else
|
||||
|
||||
#ifdef CONFIG_DEBUG_VIRTUAL
|
||||
unsigned long __phys_addr(unsigned long x)
|
||||
{
|
||||
/* VMALLOC_* aren't constants */
|
||||
VIRTUAL_BUG_ON(x < PAGE_OFFSET);
|
||||
VIRTUAL_BUG_ON(__vmalloc_start_set && 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 (__vmalloc_start_set && is_vmalloc_addr((void *) x))
|
||||
return false;
|
||||
if (x >= FIXADDR_START)
|
||||
return false;
|
||||
return pfn_valid((x - PAGE_OFFSET) >> PAGE_SHIFT);
|
||||
}
|
||||
EXPORT_SYMBOL(__virt_addr_valid);
|
||||
|
||||
#endif
|
||||
#include "physaddr.h"
|
||||
|
||||
int page_is_ram(unsigned long pagenr)
|
||||
{
|
||||
|
|
70
arch/x86/mm/physaddr.c
Normal file
70
arch/x86/mm/physaddr.c
Normal file
|
@ -0,0 +1,70 @@
|
|||
#include <linux/mmdebug.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/mm.h>
|
||||
|
||||
#include <asm/page.h>
|
||||
|
||||
#include "physaddr.h"
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
|
||||
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(!phys_addr_valid(x));
|
||||
}
|
||||
return 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 (!phys_addr_valid(x))
|
||||
return false;
|
||||
}
|
||||
|
||||
return pfn_valid(x >> PAGE_SHIFT);
|
||||
}
|
||||
EXPORT_SYMBOL(__virt_addr_valid);
|
||||
|
||||
#else
|
||||
|
||||
#ifdef CONFIG_DEBUG_VIRTUAL
|
||||
unsigned long __phys_addr(unsigned long x)
|
||||
{
|
||||
/* VMALLOC_* aren't constants */
|
||||
VIRTUAL_BUG_ON(x < PAGE_OFFSET);
|
||||
VIRTUAL_BUG_ON(__vmalloc_start_set && 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 (__vmalloc_start_set && is_vmalloc_addr((void *) x))
|
||||
return false;
|
||||
if (x >= FIXADDR_START)
|
||||
return false;
|
||||
return pfn_valid((x - PAGE_OFFSET) >> PAGE_SHIFT);
|
||||
}
|
||||
EXPORT_SYMBOL(__virt_addr_valid);
|
||||
|
||||
#endif /* CONFIG_X86_64 */
|
10
arch/x86/mm/physaddr.h
Normal file
10
arch/x86/mm/physaddr.h
Normal file
|
@ -0,0 +1,10 @@
|
|||
#include <asm/processor.h>
|
||||
|
||||
static inline int phys_addr_valid(resource_size_t addr)
|
||||
{
|
||||
#ifdef CONFIG_PHYS_ADDR_T_64BIT
|
||||
return !(addr >> boot_cpu_data.x86_phys_bits);
|
||||
#else
|
||||
return 1;
|
||||
#endif
|
||||
}
|
Loading…
Reference in a new issue