forked from Minki/linux
x86: Use __pa_symbol instead of __pa on C visible symbols
When I made an attempt at separating __pa_symbol and __pa I found that there were a number of cases where __pa was used on an obvious symbol. I also caught one non-obvious case as _brk_start and _brk_end are based on the address of __brk_base which is a C visible symbol. In mark_rodata_ro I was able to reduce the overhead of kernel symbol to virtual memory translation by using a combination of __va(__pa_symbol()) instead of page_address(virt_to_page()). Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com> Link: http://lkml.kernel.org/r/20121116215640.8521.80483.stgit@ahduyck-cp1.jf.intel.com Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
This commit is contained in:
parent
05a476b6e3
commit
fc8d782677
@ -168,7 +168,7 @@ int __cpuinit ppro_with_ram_bug(void)
|
|||||||
#ifdef CONFIG_X86_F00F_BUG
|
#ifdef CONFIG_X86_F00F_BUG
|
||||||
static void __cpuinit trap_init_f00f_bug(void)
|
static void __cpuinit trap_init_f00f_bug(void)
|
||||||
{
|
{
|
||||||
__set_fixmap(FIX_F00F_IDT, __pa(&idt_table), PAGE_KERNEL_RO);
|
__set_fixmap(FIX_F00F_IDT, __pa_symbol(idt_table), PAGE_KERNEL_RO);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Update the IDT descriptor and reload the IDT so that
|
* Update the IDT descriptor and reload the IDT so that
|
||||||
|
@ -300,8 +300,8 @@ static void __init cleanup_highmap(void)
|
|||||||
static void __init reserve_brk(void)
|
static void __init reserve_brk(void)
|
||||||
{
|
{
|
||||||
if (_brk_end > _brk_start)
|
if (_brk_end > _brk_start)
|
||||||
memblock_reserve(__pa(_brk_start),
|
memblock_reserve(__pa_symbol(_brk_start),
|
||||||
__pa(_brk_end) - __pa(_brk_start));
|
_brk_end - _brk_start);
|
||||||
|
|
||||||
/* Mark brk area as locked down and no longer taking any
|
/* Mark brk area as locked down and no longer taking any
|
||||||
new allocations */
|
new allocations */
|
||||||
@ -761,12 +761,12 @@ void __init setup_arch(char **cmdline_p)
|
|||||||
init_mm.end_data = (unsigned long) _edata;
|
init_mm.end_data = (unsigned long) _edata;
|
||||||
init_mm.brk = _brk_end;
|
init_mm.brk = _brk_end;
|
||||||
|
|
||||||
code_resource.start = virt_to_phys(_text);
|
code_resource.start = __pa_symbol(_text);
|
||||||
code_resource.end = virt_to_phys(_etext)-1;
|
code_resource.end = __pa_symbol(_etext)-1;
|
||||||
data_resource.start = virt_to_phys(_etext);
|
data_resource.start = __pa_symbol(_etext);
|
||||||
data_resource.end = virt_to_phys(_edata)-1;
|
data_resource.end = __pa_symbol(_edata)-1;
|
||||||
bss_resource.start = virt_to_phys(&__bss_start);
|
bss_resource.start = __pa_symbol(__bss_start);
|
||||||
bss_resource.end = virt_to_phys(&__bss_stop)-1;
|
bss_resource.end = __pa_symbol(__bss_stop)-1;
|
||||||
|
|
||||||
#ifdef CONFIG_CMDLINE_BOOL
|
#ifdef CONFIG_CMDLINE_BOOL
|
||||||
#ifdef CONFIG_CMDLINE_OVERRIDE
|
#ifdef CONFIG_CMDLINE_OVERRIDE
|
||||||
|
@ -770,12 +770,10 @@ void set_kernel_text_ro(void)
|
|||||||
void mark_rodata_ro(void)
|
void mark_rodata_ro(void)
|
||||||
{
|
{
|
||||||
unsigned long start = PFN_ALIGN(_text);
|
unsigned long start = PFN_ALIGN(_text);
|
||||||
unsigned long rodata_start =
|
unsigned long rodata_start = PFN_ALIGN(__start_rodata);
|
||||||
((unsigned long)__start_rodata + PAGE_SIZE - 1) & PAGE_MASK;
|
|
||||||
unsigned long end = (unsigned long) &__end_rodata_hpage_align;
|
unsigned long end = (unsigned long) &__end_rodata_hpage_align;
|
||||||
unsigned long text_end = PAGE_ALIGN((unsigned long) &__stop___ex_table);
|
unsigned long text_end = PFN_ALIGN(&__stop___ex_table);
|
||||||
unsigned long rodata_end = PAGE_ALIGN((unsigned long) &__end_rodata);
|
unsigned long rodata_end = PFN_ALIGN(&__end_rodata);
|
||||||
unsigned long data_start = (unsigned long) &_sdata;
|
|
||||||
|
|
||||||
printk(KERN_INFO "Write protecting the kernel read-only data: %luk\n",
|
printk(KERN_INFO "Write protecting the kernel read-only data: %luk\n",
|
||||||
(end - start) >> 10);
|
(end - start) >> 10);
|
||||||
@ -800,12 +798,12 @@ void mark_rodata_ro(void)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
free_init_pages("unused kernel memory",
|
free_init_pages("unused kernel memory",
|
||||||
(unsigned long) page_address(virt_to_page(text_end)),
|
(unsigned long) __va(__pa_symbol(text_end)),
|
||||||
(unsigned long)
|
(unsigned long) __va(__pa_symbol(rodata_start)));
|
||||||
page_address(virt_to_page(rodata_start)));
|
|
||||||
free_init_pages("unused kernel memory",
|
free_init_pages("unused kernel memory",
|
||||||
(unsigned long) page_address(virt_to_page(rodata_end)),
|
(unsigned long) __va(__pa_symbol(rodata_end)),
|
||||||
(unsigned long) page_address(virt_to_page(data_start)));
|
(unsigned long) __va(__pa_symbol(_sdata)));
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -94,12 +94,12 @@ static inline void split_page_count(int level) { }
|
|||||||
|
|
||||||
static inline unsigned long highmap_start_pfn(void)
|
static inline unsigned long highmap_start_pfn(void)
|
||||||
{
|
{
|
||||||
return __pa(_text) >> PAGE_SHIFT;
|
return __pa_symbol(_text) >> PAGE_SHIFT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline unsigned long highmap_end_pfn(void)
|
static inline unsigned long highmap_end_pfn(void)
|
||||||
{
|
{
|
||||||
return __pa(roundup(_brk_end, PMD_SIZE)) >> PAGE_SHIFT;
|
return __pa_symbol(roundup(_brk_end, PMD_SIZE)) >> PAGE_SHIFT;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@ -276,8 +276,8 @@ static inline pgprot_t static_protections(pgprot_t prot, unsigned long address,
|
|||||||
* The .rodata section needs to be read-only. Using the pfn
|
* The .rodata section needs to be read-only. Using the pfn
|
||||||
* catches all aliases.
|
* catches all aliases.
|
||||||
*/
|
*/
|
||||||
if (within(pfn, __pa((unsigned long)__start_rodata) >> PAGE_SHIFT,
|
if (within(pfn, __pa_symbol(__start_rodata) >> PAGE_SHIFT,
|
||||||
__pa((unsigned long)__end_rodata) >> PAGE_SHIFT))
|
__pa_symbol(__end_rodata) >> PAGE_SHIFT))
|
||||||
pgprot_val(forbidden) |= _PAGE_RW;
|
pgprot_val(forbidden) |= _PAGE_RW;
|
||||||
|
|
||||||
#if defined(CONFIG_X86_64) && defined(CONFIG_DEBUG_RODATA)
|
#if defined(CONFIG_X86_64) && defined(CONFIG_DEBUG_RODATA)
|
||||||
|
@ -410,8 +410,8 @@ void __init efi_reserve_boot_services(void)
|
|||||||
* - Not within any part of the kernel
|
* - Not within any part of the kernel
|
||||||
* - Not the bios reserved area
|
* - Not the bios reserved area
|
||||||
*/
|
*/
|
||||||
if ((start+size >= virt_to_phys(_text)
|
if ((start+size >= __pa_symbol(_text)
|
||||||
&& start <= virt_to_phys(_end)) ||
|
&& start <= __pa_symbol(_end)) ||
|
||||||
!e820_all_mapped(start, start+size, E820_RAM) ||
|
!e820_all_mapped(start, start+size, E820_RAM) ||
|
||||||
memblock_is_region_reserved(start, size)) {
|
memblock_is_region_reserved(start, size)) {
|
||||||
/* Could not reserve, skip it */
|
/* Could not reserve, skip it */
|
||||||
|
@ -62,9 +62,9 @@ void __init setup_real_mode(void)
|
|||||||
__va(real_mode_header->trampoline_header);
|
__va(real_mode_header->trampoline_header);
|
||||||
|
|
||||||
#ifdef CONFIG_X86_32
|
#ifdef CONFIG_X86_32
|
||||||
trampoline_header->start = __pa(startup_32_smp);
|
trampoline_header->start = __pa_symbol(startup_32_smp);
|
||||||
trampoline_header->gdt_limit = __BOOT_DS + 7;
|
trampoline_header->gdt_limit = __BOOT_DS + 7;
|
||||||
trampoline_header->gdt_base = __pa(boot_gdt);
|
trampoline_header->gdt_base = __pa_symbol(boot_gdt);
|
||||||
#else
|
#else
|
||||||
/*
|
/*
|
||||||
* Some AMD processors will #GP(0) if EFER.LMA is set in WRMSR
|
* Some AMD processors will #GP(0) if EFER.LMA is set in WRMSR
|
||||||
@ -78,8 +78,8 @@ void __init setup_real_mode(void)
|
|||||||
*trampoline_cr4_features = read_cr4();
|
*trampoline_cr4_features = read_cr4();
|
||||||
|
|
||||||
trampoline_pgd = (u64 *) __va(real_mode_header->trampoline_pgd);
|
trampoline_pgd = (u64 *) __va(real_mode_header->trampoline_pgd);
|
||||||
trampoline_pgd[0] = __pa(level3_ident_pgt) + _KERNPG_TABLE;
|
trampoline_pgd[0] = __pa_symbol(level3_ident_pgt) + _KERNPG_TABLE;
|
||||||
trampoline_pgd[511] = __pa(level3_kernel_pgt) + _KERNPG_TABLE;
|
trampoline_pgd[511] = __pa_symbol(level3_kernel_pgt) + _KERNPG_TABLE;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user