Commit ce2eef33 authored by Jeremy Fitzhardinge's avatar Jeremy Fitzhardinge

xen: rearrange things to fix stackprotector

Make sure the stack-protector segment registers are properly set up
before calling any functions which may have stack-protection compiled
into them.

[ Impact: prevent Xen early-boot crash when stack-protector is enabled ]
Signed-off-by: default avatarJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
parent 5416c266
...@@ -5,6 +5,10 @@ CFLAGS_REMOVE_time.o = -pg ...@@ -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
......
...@@ -925,10 +925,6 @@ asmlinkage void __init xen_start_kernel(void) ...@@ -925,10 +925,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;
...@@ -937,8 +933,15 @@ asmlinkage void __init xen_start_kernel(void) ...@@ -937,8 +933,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
...@@ -948,6 +951,8 @@ asmlinkage void __init xen_start_kernel(void) ...@@ -948,6 +951,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;
...@@ -955,13 +960,6 @@ asmlinkage void __init xen_start_kernel(void) ...@@ -955,13 +960,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
......
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