diff options
author | Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> | 2009-08-17 15:26:53 -0400 |
---|---|---|
committer | Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> | 2009-08-19 20:09:28 -0400 |
commit | ce2eef33d35cd7b932492b5a81fb0febd2b323cd (patch) | |
tree | 46a6e2f61ae26428f95f991f9c61a4a01f299a06 | |
parent | 5416c2663517ebd0be0664c4d4ce3df0b116c059 (diff) |
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: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
-rw-r--r-- | arch/x86/xen/Makefile | 4 | ||||
-rw-r--r-- | arch/x86/xen/enlighten.c | 22 |
2 files changed, 14 insertions, 12 deletions
diff --git a/arch/x86/xen/Makefile b/arch/x86/xen/Makefile index 3b767d03fd6a..a5b9288b7da4 100644 --- a/arch/x86/xen/Makefile +++ b/arch/x86/xen/Makefile | |||
@@ -5,6 +5,10 @@ CFLAGS_REMOVE_time.o = -pg | |||
5 | CFLAGS_REMOVE_irq.o = -pg | 5 | CFLAGS_REMOVE_irq.o = -pg |
6 | endif | 6 | endif |
7 | 7 | ||
8 | # Make sure early boot has no stackprotector | ||
9 | nostackp := $(call cc-option, -fno-stack-protector) | ||
10 | CFLAGS_enlighten.o := $(nostackp) | ||
11 | |||
8 | obj-y := enlighten.o setup.o multicalls.o mmu.o irq.o \ | 12 | obj-y := enlighten.o setup.o multicalls.o mmu.o irq.o \ |
9 | time.o xen-asm.o xen-asm_$(BITS).o \ | 13 | time.o xen-asm.o xen-asm_$(BITS).o \ |
10 | grant-table.o suspend.o | 14 | grant-table.o suspend.o |
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index f09e8c36ee80..edcf72a3c29c 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c | |||
@@ -925,10 +925,6 @@ asmlinkage void __init xen_start_kernel(void) | |||
925 | 925 | ||
926 | xen_domain_type = XEN_PV_DOMAIN; | 926 | xen_domain_type = XEN_PV_DOMAIN; |
927 | 927 | ||
928 | BUG_ON(memcmp(xen_start_info->magic, "xen-3", 5) != 0); | ||
929 | |||
930 | xen_setup_features(); | ||
931 | |||
932 | /* Install Xen paravirt ops */ | 928 | /* Install Xen paravirt ops */ |
933 | pv_info = xen_info; | 929 | pv_info = xen_info; |
934 | pv_init_ops = xen_init_ops; | 930 | pv_init_ops = xen_init_ops; |
@@ -937,8 +933,15 @@ asmlinkage void __init xen_start_kernel(void) | |||
937 | pv_apic_ops = xen_apic_ops; | 933 | pv_apic_ops = xen_apic_ops; |
938 | pv_mmu_ops = xen_mmu_ops; | 934 | pv_mmu_ops = xen_mmu_ops; |
939 | 935 | ||
940 | xen_init_irq_ops(); | 936 | #ifdef CONFIG_X86_64 |
937 | /* | ||
938 | * Setup percpu state. We only need to do this for 64-bit | ||
939 | * because 32-bit already has %fs set properly. | ||
940 | */ | ||
941 | load_percpu_segment(0); | ||
942 | #endif | ||
941 | 943 | ||
944 | xen_init_irq_ops(); | ||
942 | xen_init_cpuid_mask(); | 945 | xen_init_cpuid_mask(); |
943 | 946 | ||
944 | #ifdef CONFIG_X86_LOCAL_APIC | 947 | #ifdef CONFIG_X86_LOCAL_APIC |
@@ -948,6 +951,8 @@ asmlinkage void __init xen_start_kernel(void) | |||
948 | set_xen_basic_apic_ops(); | 951 | set_xen_basic_apic_ops(); |
949 | #endif | 952 | #endif |
950 | 953 | ||
954 | xen_setup_features(); | ||
955 | |||
951 | if (xen_feature(XENFEAT_mmu_pt_update_preserve_ad)) { | 956 | if (xen_feature(XENFEAT_mmu_pt_update_preserve_ad)) { |
952 | pv_mmu_ops.ptep_modify_prot_start = xen_ptep_modify_prot_start; | 957 | pv_mmu_ops.ptep_modify_prot_start = xen_ptep_modify_prot_start; |
953 | pv_mmu_ops.ptep_modify_prot_commit = xen_ptep_modify_prot_commit; | 958 | pv_mmu_ops.ptep_modify_prot_commit = xen_ptep_modify_prot_commit; |
@@ -955,13 +960,6 @@ asmlinkage void __init xen_start_kernel(void) | |||
955 | 960 | ||
956 | machine_ops = xen_machine_ops; | 961 | machine_ops = xen_machine_ops; |
957 | 962 | ||
958 | #ifdef CONFIG_X86_64 | ||
959 | /* | ||
960 | * Setup percpu state. We only need to do this for 64-bit | ||
961 | * because 32-bit already has %fs set properly. | ||
962 | */ | ||
963 | load_percpu_segment(0); | ||
964 | #endif | ||
965 | /* | 963 | /* |
966 | * The only reliable way to retain the initial address of the | 964 | * The only reliable way to retain the initial address of the |
967 | * percpu gdt_page is to remember it here, so we can go and | 965 | * percpu gdt_page is to remember it here, so we can go and |