Commit a7bf0bd5 authored by Jeremy Fitzhardinge's avatar Jeremy Fitzhardinge Committed by Ingo Molnar

build: add __page_aligned_data and __page_aligned_bss

Making a variable page-aligned by using
__attribute__((section(".data.page_aligned"))) is fragile because if
sizeof(variable) is not also a multiple of page size, it leaves
variables in the remainder of the section unaligned.

This patch introduces two new qualifiers, __page_aligned_data and
__page_aligned_bss to set the section *and* the alignment of
variables.  This makes page-aligned variables more robust because the
linker will make sure they're aligned properly.  Unfortunately it
requires *all* page-aligned data to use these macros...
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 1ecd2765
...@@ -40,7 +40,7 @@ EXPORT_SYMBOL(_cpu_pda); ...@@ -40,7 +40,7 @@ EXPORT_SYMBOL(_cpu_pda);
struct desc_ptr idt_descr = { 256 * 16 - 1, (unsigned long) idt_table }; struct desc_ptr idt_descr = { 256 * 16 - 1, (unsigned long) idt_table };
char boot_cpu_stack[IRQSTACKSIZE] __attribute__((section(".bss.page_aligned"))); char boot_cpu_stack[IRQSTACKSIZE] __page_aligned_bss;
unsigned long __supported_pte_mask __read_mostly = ~0UL; unsigned long __supported_pte_mask __read_mostly = ~0UL;
EXPORT_SYMBOL_GPL(__supported_pte_mask); EXPORT_SYMBOL_GPL(__supported_pte_mask);
......
...@@ -394,8 +394,7 @@ static int __init early_ioremap_debug_setup(char *str) ...@@ -394,8 +394,7 @@ static int __init early_ioremap_debug_setup(char *str)
early_param("early_ioremap_debug", early_ioremap_debug_setup); early_param("early_ioremap_debug", early_ioremap_debug_setup);
static __initdata int after_paging_init; static __initdata int after_paging_init;
static pte_t bm_pte[PAGE_SIZE/sizeof(pte_t)] static pte_t bm_pte[PAGE_SIZE/sizeof(pte_t)] __page_aligned_bss;
__section(.bss.page_aligned);
static inline pmd_t * __init early_ioremap_pmd(unsigned long addr) static inline pmd_t * __init early_ioremap_pmd(unsigned long addr)
{ {
......
#ifndef _LINUX_LINKAGE_H #ifndef _LINUX_LINKAGE_H
#define _LINUX_LINKAGE_H #define _LINUX_LINKAGE_H
#include <linux/compiler.h>
#include <asm/linkage.h> #include <asm/linkage.h>
#ifdef __cplusplus #ifdef __cplusplus
...@@ -17,6 +18,9 @@ ...@@ -17,6 +18,9 @@
# define asmregparm # define asmregparm
#endif #endif
#define __page_aligned_data __section(.data.page_aligned) __aligned(PAGE_SIZE)
#define __page_aligned_bss __section(.bss.page_aligned) __aligned(PAGE_SIZE)
/* /*
* This is used by architectures to keep arguments on the stack * This is used by architectures to keep arguments on the stack
* untouched by the compiler by keeping them live until the end. * untouched by the compiler by keeping them live until the end.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment