diff options
-rw-r--r-- | arch/x86/kernel/cpu/common_64.c | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/arch/x86/kernel/cpu/common_64.c b/arch/x86/kernel/cpu/common_64.c index 8396fd7628a9..cc6efe86249d 100644 --- a/arch/x86/kernel/cpu/common_64.c +++ b/arch/x86/kernel/cpu/common_64.c | |||
@@ -606,19 +606,22 @@ void __cpuinit cpu_init(void) | |||
606 | /* | 606 | /* |
607 | * set up and load the per-CPU TSS | 607 | * set up and load the per-CPU TSS |
608 | */ | 608 | */ |
609 | for (v = 0; v < N_EXCEPTION_STACKS; v++) { | 609 | if (!orig_ist->ist[0]) { |
610 | static const unsigned int order[N_EXCEPTION_STACKS] = { | 610 | static const unsigned int order[N_EXCEPTION_STACKS] = { |
611 | [0 ... N_EXCEPTION_STACKS - 1] = EXCEPTION_STACK_ORDER, | 611 | [0 ... N_EXCEPTION_STACKS - 1] = EXCEPTION_STACK_ORDER, |
612 | [DEBUG_STACK - 1] = DEBUG_STACK_ORDER | 612 | [DEBUG_STACK - 1] = DEBUG_STACK_ORDER |
613 | }; | 613 | }; |
614 | if (cpu) { | 614 | for (v = 0; v < N_EXCEPTION_STACKS; v++) { |
615 | estacks = (char *)__get_free_pages(GFP_ATOMIC, order[v]); | 615 | if (cpu) { |
616 | if (!estacks) | 616 | estacks = (char *)__get_free_pages(GFP_ATOMIC, order[v]); |
617 | panic("Cannot allocate exception stack %ld %d\n", | 617 | if (!estacks) |
618 | v, cpu); | 618 | panic("Cannot allocate exception " |
619 | "stack %ld %d\n", v, cpu); | ||
620 | } | ||
621 | estacks += PAGE_SIZE << order[v]; | ||
622 | orig_ist->ist[v] = t->x86_tss.ist[v] = | ||
623 | (unsigned long)estacks; | ||
619 | } | 624 | } |
620 | estacks += PAGE_SIZE << order[v]; | ||
621 | orig_ist->ist[v] = t->x86_tss.ist[v] = (unsigned long)estacks; | ||
622 | } | 625 | } |
623 | 626 | ||
624 | t->x86_tss.io_bitmap_base = offsetof(struct tss_struct, io_bitmap); | 627 | t->x86_tss.io_bitmap_base = offsetof(struct tss_struct, io_bitmap); |