initialize_tlbstate_and_flush();
        enter_lazy_tlb(&init_mm, me);
 
-       load_sp0(current->thread.sp0);
+       /*
+        * Initialize the TSS.  Don't bother initializing sp0, as the initial
+        * task never enters user mode.
+        */
        set_tss_desc(cpu, t);
        load_TR_desc();
+
        load_mm_ldt(&init_mm);
 
        clear_all_debug_regs();
        int cpu = smp_processor_id();
        struct task_struct *curr = current;
        struct tss_struct *t = &per_cpu(cpu_tss, cpu);
-       struct thread_struct *thread = &curr->thread;
 
        wait_for_master_cpu(cpu);
 
        initialize_tlbstate_and_flush();
        enter_lazy_tlb(&init_mm, curr);
 
-       load_sp0(thread->sp0);
+       /*
+        * Initialize the TSS.  Don't bother initializing sp0, as the initial
+        * task never enters user mode.
+        */
        set_tss_desc(cpu, t);
        load_TR_desc();
+
        load_mm_ldt(&init_mm);
 
        t->x86_tss.io_bitmap_base = offsetof(struct tss_struct, io_bitmap);
 
  */
 __visible DEFINE_PER_CPU_SHARED_ALIGNED(struct tss_struct, cpu_tss) = {
        .x86_tss = {
-               .sp0 = TOP_OF_INIT_STACK,
+               /*
+                * .sp0 is only used when entering ring 0 from a lower
+                * privilege level.  Since the init task never runs anything
+                * but ring 0 code, there is no need for a valid value here.
+                * Poison it.
+                */
+               .sp0 = (1UL << (BITS_PER_LONG-1)) + 1,
 #ifdef CONFIG_X86_32
                .ss0 = __KERNEL_DS,
                .ss1 = __KERNEL_CS,