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: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
committed by
Ingo Molnar
parent
1ecd27657b
commit
a7bf0bd5e6
@@ -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)
|
|||||||
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)
|
||||||
{
|
{
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
#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 @@
|
|||||||
# 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.
|
||||||
|
Reference in New Issue
Block a user