diff options
-rw-r--r-- | arch/x86/xen/enlighten.c | 15 | ||||
-rw-r--r-- | arch/x86/xen/smp.c | 6 | ||||
-rw-r--r-- | arch/x86/xen/xen-ops.h | 2 |
3 files changed, 20 insertions, 3 deletions
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index cd022c43dfbc..aed7ceeb4b65 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c | |||
@@ -66,6 +66,8 @@ EXPORT_SYMBOL_GPL(xen_start_info); | |||
66 | 66 | ||
67 | struct shared_info xen_dummy_shared_info; | 67 | struct shared_info xen_dummy_shared_info; |
68 | 68 | ||
69 | void *xen_initial_gdt; | ||
70 | |||
69 | /* | 71 | /* |
70 | * Point at some empty memory to start with. We map the real shared_info | 72 | * Point at some empty memory to start with. We map the real shared_info |
71 | * page as soon as fixmap is up and running. | 73 | * page as soon as fixmap is up and running. |
@@ -917,8 +919,19 @@ asmlinkage void __init xen_start_kernel(void) | |||
917 | have_vcpu_info_placement = 0; | 919 | have_vcpu_info_placement = 0; |
918 | #endif | 920 | #endif |
919 | 921 | ||
920 | /* setup percpu state */ | 922 | #ifdef CONFIG_X86_64 |
923 | /* | ||
924 | * Setup percpu state. We only need to do this for 64-bit | ||
925 | * because 32-bit already has %fs set properly. | ||
926 | */ | ||
921 | load_percpu_segment(0); | 927 | load_percpu_segment(0); |
928 | #endif | ||
929 | /* | ||
930 | * The only reliable way to retain the initial address of the | ||
931 | * percpu gdt_page is to remember it here, so we can go and | ||
932 | * mark it RW later, when the initial percpu area is freed. | ||
933 | */ | ||
934 | xen_initial_gdt = &per_cpu(gdt_page, 0); | ||
922 | 935 | ||
923 | xen_smp_init(); | 936 | xen_smp_init(); |
924 | 937 | ||
diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c index 88d5d5ec6beb..035582ae815d 100644 --- a/arch/x86/xen/smp.c +++ b/arch/x86/xen/smp.c | |||
@@ -170,8 +170,7 @@ static void __init xen_smp_prepare_boot_cpu(void) | |||
170 | 170 | ||
171 | /* We've switched to the "real" per-cpu gdt, so make sure the | 171 | /* We've switched to the "real" per-cpu gdt, so make sure the |
172 | old memory can be recycled */ | 172 | old memory can be recycled */ |
173 | make_lowmem_page_readwrite(__per_cpu_load + | 173 | make_lowmem_page_readwrite(xen_initial_gdt); |
174 | (unsigned long)&per_cpu_var(gdt_page)); | ||
175 | 174 | ||
176 | xen_setup_vcpu_info_placement(); | 175 | xen_setup_vcpu_info_placement(); |
177 | } | 176 | } |
@@ -287,6 +286,9 @@ static int __cpuinit xen_cpu_up(unsigned int cpu) | |||
287 | irq_ctx_init(cpu); | 286 | irq_ctx_init(cpu); |
288 | #else | 287 | #else |
289 | clear_tsk_thread_flag(idle, TIF_FORK); | 288 | clear_tsk_thread_flag(idle, TIF_FORK); |
289 | per_cpu(kernel_stack, cpu) = | ||
290 | (unsigned long)task_stack_page(idle) - | ||
291 | KERNEL_STACK_OFFSET + THREAD_SIZE; | ||
290 | #endif | 292 | #endif |
291 | xen_setup_timer(cpu); | 293 | xen_setup_timer(cpu); |
292 | xen_init_lock_cpu(cpu); | 294 | xen_init_lock_cpu(cpu); |
diff --git a/arch/x86/xen/xen-ops.h b/arch/x86/xen/xen-ops.h index 11913fc94c14..2f5ef2632ea2 100644 --- a/arch/x86/xen/xen-ops.h +++ b/arch/x86/xen/xen-ops.h | |||
@@ -10,6 +10,8 @@ | |||
10 | extern const char xen_hypervisor_callback[]; | 10 | extern const char xen_hypervisor_callback[]; |
11 | extern const char xen_failsafe_callback[]; | 11 | extern const char xen_failsafe_callback[]; |
12 | 12 | ||
13 | extern void *xen_initial_gdt; | ||
14 | |||
13 | struct trap_info; | 15 | struct trap_info; |
14 | void xen_copy_trap_info(struct trap_info *traps); | 16 | void xen_copy_trap_info(struct trap_info *traps); |
15 | 17 | ||