Merge branch 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: x86: Fix build with older binutils and consolidate linker script x86: Fix an incorrect argument of reserve_bootmem() x86: add vmlinux.lds to targets in arch/x86/boot/compressed/Makefile xen: rearrange things to fix stackprotector x86: make sure load_percpu_segment has no stackprotector i386: Fix section mismatches for init code with !HOTPLUG_CPU x86, pat: Allow ISA memory range uncacheable mapping requests
This commit is contained in:
commit
9f459fadbb
@ -4,7 +4,7 @@
|
|||||||
# create a compressed vmlinux image from the original vmlinux
|
# create a compressed vmlinux image from the original vmlinux
|
||||||
#
|
#
|
||||||
|
|
||||||
targets := vmlinux vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2 vmlinux.bin.lzma head_$(BITS).o misc.o piggy.o
|
targets := vmlinux.lds vmlinux vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2 vmlinux.bin.lzma head_$(BITS).o misc.o piggy.o
|
||||||
|
|
||||||
KBUILD_CFLAGS := -m$(BITS) -D__KERNEL__ $(LINUX_INCLUDE) -O2
|
KBUILD_CFLAGS := -m$(BITS) -D__KERNEL__ $(LINUX_INCLUDE) -O2
|
||||||
KBUILD_CFLAGS += -fno-strict-aliasing -fPIC
|
KBUILD_CFLAGS += -fno-strict-aliasing -fPIC
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
#define _ASM_X86_PGTABLE_H
|
#define _ASM_X86_PGTABLE_H
|
||||||
|
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
|
#include <asm/e820.h>
|
||||||
|
|
||||||
#include <asm/pgtable_types.h>
|
#include <asm/pgtable_types.h>
|
||||||
|
|
||||||
@ -269,9 +270,16 @@ static inline pgprot_t pgprot_modify(pgprot_t oldprot, pgprot_t newprot)
|
|||||||
|
|
||||||
#define canon_pgprot(p) __pgprot(massage_pgprot(p))
|
#define canon_pgprot(p) __pgprot(massage_pgprot(p))
|
||||||
|
|
||||||
static inline int is_new_memtype_allowed(unsigned long flags,
|
static inline int is_new_memtype_allowed(u64 paddr, unsigned long size,
|
||||||
unsigned long new_flags)
|
unsigned long flags,
|
||||||
|
unsigned long new_flags)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
* PAT type is always WB for ISA. So no need to check.
|
||||||
|
*/
|
||||||
|
if (is_ISA_range(paddr, paddr + size - 1))
|
||||||
|
return 1;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Certain new memtypes are not allowed with certain
|
* Certain new memtypes are not allowed with certain
|
||||||
* requested memtype:
|
* requested memtype:
|
||||||
|
@ -7,6 +7,10 @@ ifdef CONFIG_FUNCTION_TRACER
|
|||||||
CFLAGS_REMOVE_common.o = -pg
|
CFLAGS_REMOVE_common.o = -pg
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# Make sure load_percpu_segment has no stackprotector
|
||||||
|
nostackp := $(call cc-option, -fno-stack-protector)
|
||||||
|
CFLAGS_common.o := $(nostackp)
|
||||||
|
|
||||||
obj-y := intel_cacheinfo.o addon_cpuid_features.o
|
obj-y := intel_cacheinfo.o addon_cpuid_features.o
|
||||||
obj-y += proc.o capflags.o powerflags.o common.o
|
obj-y += proc.o capflags.o powerflags.o common.o
|
||||||
obj-y += vmware.o hypervisor.o
|
obj-y += vmware.o hypervisor.o
|
||||||
|
@ -261,9 +261,7 @@ page_pde_offset = (__PAGE_OFFSET >> 20);
|
|||||||
* which will be freed later
|
* which will be freed later
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef CONFIG_HOTPLUG_CPU
|
__CPUINIT
|
||||||
.section .init.text,"ax",@progbits
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
ENTRY(startup_32_smp)
|
ENTRY(startup_32_smp)
|
||||||
@ -602,11 +600,7 @@ ignore_int:
|
|||||||
#endif
|
#endif
|
||||||
iret
|
iret
|
||||||
|
|
||||||
#ifndef CONFIG_HOTPLUG_CPU
|
|
||||||
__CPUINITDATA
|
|
||||||
#else
|
|
||||||
__REFDATA
|
__REFDATA
|
||||||
#endif
|
|
||||||
.align 4
|
.align 4
|
||||||
ENTRY(initial_code)
|
ENTRY(initial_code)
|
||||||
.long i386_start_kernel
|
.long i386_start_kernel
|
||||||
|
@ -46,11 +46,10 @@ PHDRS {
|
|||||||
data PT_LOAD FLAGS(7); /* RWE */
|
data PT_LOAD FLAGS(7); /* RWE */
|
||||||
#ifdef CONFIG_X86_64
|
#ifdef CONFIG_X86_64
|
||||||
user PT_LOAD FLAGS(7); /* RWE */
|
user PT_LOAD FLAGS(7); /* RWE */
|
||||||
data.init PT_LOAD FLAGS(7); /* RWE */
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
percpu PT_LOAD FLAGS(7); /* RWE */
|
percpu PT_LOAD FLAGS(7); /* RWE */
|
||||||
#endif
|
#endif
|
||||||
data.init2 PT_LOAD FLAGS(7); /* RWE */
|
init PT_LOAD FLAGS(7); /* RWE */
|
||||||
#endif
|
#endif
|
||||||
note PT_NOTE FLAGS(0); /* ___ */
|
note PT_NOTE FLAGS(0); /* ___ */
|
||||||
}
|
}
|
||||||
@ -103,65 +102,43 @@ SECTIONS
|
|||||||
__stop___ex_table = .;
|
__stop___ex_table = .;
|
||||||
} :text = 0x9090
|
} :text = 0x9090
|
||||||
|
|
||||||
RODATA
|
RO_DATA(PAGE_SIZE)
|
||||||
|
|
||||||
/* Data */
|
/* Data */
|
||||||
. = ALIGN(PAGE_SIZE);
|
|
||||||
.data : AT(ADDR(.data) - LOAD_OFFSET) {
|
.data : AT(ADDR(.data) - LOAD_OFFSET) {
|
||||||
/* Start of data section */
|
/* Start of data section */
|
||||||
_sdata = .;
|
_sdata = .;
|
||||||
|
|
||||||
|
/* init_task */
|
||||||
|
INIT_TASK_DATA(THREAD_SIZE)
|
||||||
|
|
||||||
|
#ifdef CONFIG_X86_32
|
||||||
|
/* 32 bit has nosave before _edata */
|
||||||
|
NOSAVE_DATA
|
||||||
|
#endif
|
||||||
|
|
||||||
|
PAGE_ALIGNED_DATA(PAGE_SIZE)
|
||||||
|
*(.data.idt)
|
||||||
|
|
||||||
|
CACHELINE_ALIGNED_DATA(CONFIG_X86_L1_CACHE_BYTES)
|
||||||
|
|
||||||
DATA_DATA
|
DATA_DATA
|
||||||
CONSTRUCTORS
|
CONSTRUCTORS
|
||||||
} :data
|
|
||||||
|
|
||||||
#ifdef CONFIG_X86_32
|
/* rarely changed data like cpu maps */
|
||||||
/* 32 bit has nosave before _edata */
|
READ_MOSTLY_DATA(CONFIG_X86_INTERNODE_CACHE_BYTES)
|
||||||
. = ALIGN(PAGE_SIZE);
|
|
||||||
.data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) {
|
|
||||||
__nosave_begin = .;
|
|
||||||
*(.data.nosave)
|
|
||||||
. = ALIGN(PAGE_SIZE);
|
|
||||||
__nosave_end = .;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
. = ALIGN(PAGE_SIZE);
|
|
||||||
.data.page_aligned : AT(ADDR(.data.page_aligned) - LOAD_OFFSET) {
|
|
||||||
*(.data.page_aligned)
|
|
||||||
*(.data.idt)
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CONFIG_X86_32
|
|
||||||
. = ALIGN(32);
|
|
||||||
#else
|
|
||||||
. = ALIGN(PAGE_SIZE);
|
|
||||||
. = ALIGN(CONFIG_X86_L1_CACHE_BYTES);
|
|
||||||
#endif
|
|
||||||
.data.cacheline_aligned :
|
|
||||||
AT(ADDR(.data.cacheline_aligned) - LOAD_OFFSET) {
|
|
||||||
*(.data.cacheline_aligned)
|
|
||||||
}
|
|
||||||
|
|
||||||
/* rarely changed data like cpu maps */
|
|
||||||
#ifdef CONFIG_X86_32
|
|
||||||
. = ALIGN(32);
|
|
||||||
#else
|
|
||||||
. = ALIGN(CONFIG_X86_INTERNODE_CACHE_BYTES);
|
|
||||||
#endif
|
|
||||||
.data.read_mostly : AT(ADDR(.data.read_mostly) - LOAD_OFFSET) {
|
|
||||||
*(.data.read_mostly)
|
|
||||||
|
|
||||||
/* End of data section */
|
/* End of data section */
|
||||||
_edata = .;
|
_edata = .;
|
||||||
}
|
} :data
|
||||||
|
|
||||||
#ifdef CONFIG_X86_64
|
#ifdef CONFIG_X86_64
|
||||||
|
|
||||||
#define VSYSCALL_ADDR (-10*1024*1024)
|
#define VSYSCALL_ADDR (-10*1024*1024)
|
||||||
#define VSYSCALL_PHYS_ADDR ((LOADADDR(.data.read_mostly) + \
|
#define VSYSCALL_PHYS_ADDR ((LOADADDR(.data) + SIZEOF(.data) + \
|
||||||
SIZEOF(.data.read_mostly) + 4095) & ~(4095))
|
PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))
|
||||||
#define VSYSCALL_VIRT_ADDR ((ADDR(.data.read_mostly) + \
|
#define VSYSCALL_VIRT_ADDR ((ADDR(.data) + SIZEOF(.data) + \
|
||||||
SIZEOF(.data.read_mostly) + 4095) & ~(4095))
|
PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))
|
||||||
|
|
||||||
#define VLOAD_OFFSET (VSYSCALL_ADDR - VSYSCALL_PHYS_ADDR)
|
#define VLOAD_OFFSET (VSYSCALL_ADDR - VSYSCALL_PHYS_ADDR)
|
||||||
#define VLOAD(x) (ADDR(x) - VLOAD_OFFSET)
|
#define VLOAD(x) (ADDR(x) - VLOAD_OFFSET)
|
||||||
@ -227,35 +204,29 @@ SECTIONS
|
|||||||
|
|
||||||
#endif /* CONFIG_X86_64 */
|
#endif /* CONFIG_X86_64 */
|
||||||
|
|
||||||
/* init_task */
|
|
||||||
. = ALIGN(THREAD_SIZE);
|
|
||||||
.data.init_task : AT(ADDR(.data.init_task) - LOAD_OFFSET) {
|
|
||||||
*(.data.init_task)
|
|
||||||
}
|
|
||||||
#ifdef CONFIG_X86_64
|
|
||||||
:data.init
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* smp_locks might be freed after init
|
|
||||||
* start/end must be page aligned
|
|
||||||
*/
|
|
||||||
. = ALIGN(PAGE_SIZE);
|
|
||||||
.smp_locks : AT(ADDR(.smp_locks) - LOAD_OFFSET) {
|
|
||||||
__smp_locks = .;
|
|
||||||
*(.smp_locks)
|
|
||||||
__smp_locks_end = .;
|
|
||||||
. = ALIGN(PAGE_SIZE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Init code and data - will be freed after init */
|
/* Init code and data - will be freed after init */
|
||||||
. = ALIGN(PAGE_SIZE);
|
. = ALIGN(PAGE_SIZE);
|
||||||
.init.text : AT(ADDR(.init.text) - LOAD_OFFSET) {
|
.init.begin : AT(ADDR(.init.begin) - LOAD_OFFSET) {
|
||||||
__init_begin = .; /* paired with __init_end */
|
__init_begin = .; /* paired with __init_end */
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(CONFIG_X86_64) && defined(CONFIG_SMP)
|
||||||
|
/*
|
||||||
|
* percpu offsets are zero-based on SMP. PERCPU_VADDR() changes the
|
||||||
|
* output PHDR, so the next output section - .init.text - should
|
||||||
|
* start another segment - init.
|
||||||
|
*/
|
||||||
|
PERCPU_VADDR(0, :percpu)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
.init.text : AT(ADDR(.init.text) - LOAD_OFFSET) {
|
||||||
_sinittext = .;
|
_sinittext = .;
|
||||||
INIT_TEXT
|
INIT_TEXT
|
||||||
_einittext = .;
|
_einittext = .;
|
||||||
}
|
}
|
||||||
|
#ifdef CONFIG_X86_64
|
||||||
|
:init
|
||||||
|
#endif
|
||||||
|
|
||||||
.init.data : AT(ADDR(.init.data) - LOAD_OFFSET) {
|
.init.data : AT(ADDR(.init.data) - LOAD_OFFSET) {
|
||||||
INIT_DATA
|
INIT_DATA
|
||||||
@ -326,17 +297,7 @@ SECTIONS
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_X86_64) && defined(CONFIG_SMP)
|
#if !defined(CONFIG_X86_64) || !defined(CONFIG_SMP)
|
||||||
/*
|
|
||||||
* percpu offsets are zero-based on SMP. PERCPU_VADDR() changes the
|
|
||||||
* output PHDR, so the next output section - __data_nosave - should
|
|
||||||
* start another section data.init2. Also, pda should be at the head of
|
|
||||||
* percpu area. Preallocate it and define the percpu offset symbol
|
|
||||||
* so that it can be accessed as a percpu variable.
|
|
||||||
*/
|
|
||||||
. = ALIGN(PAGE_SIZE);
|
|
||||||
PERCPU_VADDR(0, :percpu)
|
|
||||||
#else
|
|
||||||
PERCPU(PAGE_SIZE)
|
PERCPU(PAGE_SIZE)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -347,15 +308,22 @@ SECTIONS
|
|||||||
__init_end = .;
|
__init_end = .;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* smp_locks might be freed after init
|
||||||
|
* start/end must be page aligned
|
||||||
|
*/
|
||||||
|
. = ALIGN(PAGE_SIZE);
|
||||||
|
.smp_locks : AT(ADDR(.smp_locks) - LOAD_OFFSET) {
|
||||||
|
__smp_locks = .;
|
||||||
|
*(.smp_locks)
|
||||||
|
__smp_locks_end = .;
|
||||||
|
. = ALIGN(PAGE_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_X86_64
|
#ifdef CONFIG_X86_64
|
||||||
.data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) {
|
.data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) {
|
||||||
. = ALIGN(PAGE_SIZE);
|
NOSAVE_DATA
|
||||||
__nosave_begin = .;
|
}
|
||||||
*(.data.nosave)
|
|
||||||
. = ALIGN(PAGE_SIZE);
|
|
||||||
__nosave_end = .;
|
|
||||||
} :data.init2
|
|
||||||
/* use another section data.init2, see PERCPU_VADDR() above */
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* BSS */
|
/* BSS */
|
||||||
|
@ -796,7 +796,7 @@ int __init reserve_bootmem_generic(unsigned long phys, unsigned long len,
|
|||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
reserve_bootmem(phys, len, BOOTMEM_DEFAULT);
|
reserve_bootmem(phys, len, flags);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (phys+len <= MAX_DMA_PFN*PAGE_SIZE) {
|
if (phys+len <= MAX_DMA_PFN*PAGE_SIZE) {
|
||||||
|
@ -623,7 +623,8 @@ static int reserve_pfn_range(u64 paddr, unsigned long size, pgprot_t *vma_prot,
|
|||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
if (flags != want_flags) {
|
if (flags != want_flags) {
|
||||||
if (strict_prot || !is_new_memtype_allowed(want_flags, flags)) {
|
if (strict_prot ||
|
||||||
|
!is_new_memtype_allowed(paddr, size, want_flags, flags)) {
|
||||||
free_memtype(paddr, paddr + size);
|
free_memtype(paddr, paddr + size);
|
||||||
printk(KERN_ERR "%s:%d map pfn expected mapping type %s"
|
printk(KERN_ERR "%s:%d map pfn expected mapping type %s"
|
||||||
" for %Lx-%Lx, got %s\n",
|
" for %Lx-%Lx, got %s\n",
|
||||||
|
@ -5,6 +5,10 @@ CFLAGS_REMOVE_time.o = -pg
|
|||||||
CFLAGS_REMOVE_irq.o = -pg
|
CFLAGS_REMOVE_irq.o = -pg
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# Make sure early boot has no stackprotector
|
||||||
|
nostackp := $(call cc-option, -fno-stack-protector)
|
||||||
|
CFLAGS_enlighten.o := $(nostackp)
|
||||||
|
|
||||||
obj-y := enlighten.o setup.o multicalls.o mmu.o irq.o \
|
obj-y := enlighten.o setup.o multicalls.o mmu.o irq.o \
|
||||||
time.o xen-asm.o xen-asm_$(BITS).o \
|
time.o xen-asm.o xen-asm_$(BITS).o \
|
||||||
grant-table.o suspend.o
|
grant-table.o suspend.o
|
||||||
|
@ -974,10 +974,6 @@ asmlinkage void __init xen_start_kernel(void)
|
|||||||
|
|
||||||
xen_domain_type = XEN_PV_DOMAIN;
|
xen_domain_type = XEN_PV_DOMAIN;
|
||||||
|
|
||||||
BUG_ON(memcmp(xen_start_info->magic, "xen-3", 5) != 0);
|
|
||||||
|
|
||||||
xen_setup_features();
|
|
||||||
|
|
||||||
/* Install Xen paravirt ops */
|
/* Install Xen paravirt ops */
|
||||||
pv_info = xen_info;
|
pv_info = xen_info;
|
||||||
pv_init_ops = xen_init_ops;
|
pv_init_ops = xen_init_ops;
|
||||||
@ -986,8 +982,15 @@ asmlinkage void __init xen_start_kernel(void)
|
|||||||
pv_apic_ops = xen_apic_ops;
|
pv_apic_ops = xen_apic_ops;
|
||||||
pv_mmu_ops = xen_mmu_ops;
|
pv_mmu_ops = xen_mmu_ops;
|
||||||
|
|
||||||
xen_init_irq_ops();
|
#ifdef CONFIG_X86_64
|
||||||
|
/*
|
||||||
|
* Setup percpu state. We only need to do this for 64-bit
|
||||||
|
* because 32-bit already has %fs set properly.
|
||||||
|
*/
|
||||||
|
load_percpu_segment(0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
xen_init_irq_ops();
|
||||||
xen_init_cpuid_mask();
|
xen_init_cpuid_mask();
|
||||||
|
|
||||||
#ifdef CONFIG_X86_LOCAL_APIC
|
#ifdef CONFIG_X86_LOCAL_APIC
|
||||||
@ -997,6 +1000,8 @@ asmlinkage void __init xen_start_kernel(void)
|
|||||||
set_xen_basic_apic_ops();
|
set_xen_basic_apic_ops();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
xen_setup_features();
|
||||||
|
|
||||||
if (xen_feature(XENFEAT_mmu_pt_update_preserve_ad)) {
|
if (xen_feature(XENFEAT_mmu_pt_update_preserve_ad)) {
|
||||||
pv_mmu_ops.ptep_modify_prot_start = xen_ptep_modify_prot_start;
|
pv_mmu_ops.ptep_modify_prot_start = xen_ptep_modify_prot_start;
|
||||||
pv_mmu_ops.ptep_modify_prot_commit = xen_ptep_modify_prot_commit;
|
pv_mmu_ops.ptep_modify_prot_commit = xen_ptep_modify_prot_commit;
|
||||||
@ -1004,13 +1009,6 @@ asmlinkage void __init xen_start_kernel(void)
|
|||||||
|
|
||||||
machine_ops = xen_machine_ops;
|
machine_ops = xen_machine_ops;
|
||||||
|
|
||||||
#ifdef CONFIG_X86_64
|
|
||||||
/*
|
|
||||||
* Setup percpu state. We only need to do this for 64-bit
|
|
||||||
* because 32-bit already has %fs set properly.
|
|
||||||
*/
|
|
||||||
load_percpu_segment(0);
|
|
||||||
#endif
|
|
||||||
/*
|
/*
|
||||||
* The only reliable way to retain the initial address of the
|
* The only reliable way to retain the initial address of the
|
||||||
* percpu gdt_page is to remember it here, so we can go and
|
* percpu gdt_page is to remember it here, so we can go and
|
||||||
|
Loading…
Reference in New Issue
Block a user