Merge branch 'x86-debug-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 22 Mar 2012 16:30:39 +0000 (09:30 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 22 Mar 2012 16:30:39 +0000 (09:30 -0700)
Pull x86/debug changes from Ingo Molnar.

* 'x86-debug-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  x86: Fix section warnings
  x86-64: Fix CFI data for common_interrupt()
  x86: Properly _init-annotate NMI selftest code
  x86/debug: Fix/improve the show_msr=<cpus> debug print out

1  2 
arch/x86/include/asm/processor.h
arch/x86/kernel/cpu/common.c
arch/x86/kernel/entry_64.S
arch/x86/kernel/smpboot.c

index 58545c97d071c84dba4a05b59bad7be5d0b69b01,8bb062bbcbecfd63c35ad19c6eabca224f8a58b3..95da14f7ee85ad2ca592be523607d7b5231ace3c
@@@ -162,6 -162,7 +162,7 @@@ extern void early_cpu_init(void)
  extern void identify_boot_cpu(void);
  extern void identify_secondary_cpu(struct cpuinfo_x86 *);
  extern void print_cpu_info(struct cpuinfo_x86 *);
+ void print_cpu_msr(struct cpuinfo_x86 *);
  extern void init_scattered_cpuid_features(struct cpuinfo_x86 *c);
  extern unsigned int init_intel_cacheinfo(struct cpuinfo_x86 *c);
  extern unsigned short num_cache_leaves;
@@@ -374,8 -375,6 +375,8 @@@ union thread_xstate 
  };
  
  struct fpu {
 +      unsigned int last_cpu;
 +      unsigned int has_fpu;
        union thread_xstate *state;
  };
  
index c0f7d68d318f1b7a8a6a27f798250b53c778d50f,8b6a3bb57d8e57eb5cc6c482298e0d51af27ce3c..b3e0081f9a2b1697faf058c8da77b997deeedfbe
@@@ -933,7 -933,7 +933,7 @@@ static const struct msr_range msr_range
        { 0xc0011000, 0xc001103b},
  };
  
- static void __cpuinit print_cpu_msr(void)
+ static void __cpuinit __print_cpu_msr(void)
  {
        unsigned index_min, index_max;
        unsigned index;
@@@ -997,13 -997,13 +997,13 @@@ void __cpuinit print_cpu_info(struct cp
        else
                printk(KERN_CONT "\n");
  
- #ifdef CONFIG_SMP
+       __print_cpu_msr();
+ }
+ void __cpuinit print_cpu_msr(struct cpuinfo_x86 *c)
+ {
        if (c->cpu_index < show_msr)
-               print_cpu_msr();
- #else
-       if (show_msr)
-               print_cpu_msr();
- #endif
+               __print_cpu_msr();
  }
  
  static __init int setup_disablecpuid(char *arg)
@@@ -1044,9 -1044,6 +1044,9 @@@ DEFINE_PER_CPU(char *, irq_stack_ptr) 
  
  DEFINE_PER_CPU(unsigned int, irq_count) = -1;
  
 +DEFINE_PER_CPU(struct task_struct *, fpu_owner_task);
 +EXPORT_PER_CPU_SYMBOL(fpu_owner_task);
 +
  /*
   * Special IST stacks which the CPU switches to when it calls
   * an IST-marked descriptor entry. Up to 7 stacks (hardware
@@@ -1114,8 -1111,6 +1114,8 @@@ void debug_stack_reset(void
  
  DEFINE_PER_CPU(struct task_struct *, current_task) = &init_task;
  EXPORT_PER_CPU_SYMBOL(current_task);
 +DEFINE_PER_CPU(struct task_struct *, fpu_owner_task);
 +EXPORT_PER_CPU_SYMBOL(fpu_owner_task);
  
  #ifdef CONFIG_CC_STACKPROTECTOR
  DEFINE_PER_CPU_ALIGNED(struct stack_canary, stack_canary);
index a63dabe153caa24d9611c54bf11e4b041d380e0a,54be36bf2620811502fea946514c013c575dd06a..734ebd1d3caabf0e0b058a1f8ed6aa947c1caf95
@@@ -320,7 -320,7 +320,7 @@@ ENDPROC(native_usergs_sysret64
        movq %rsp, %rsi
  
        leaq -RBP(%rsp),%rdi    /* arg1 for handler */
 -      testl $3, CS(%rdi)
 +      testl $3, CS-RBP(%rsi)
        je 1f
        SWAPGS
        /*
         * moving irq_enter into assembly, which would be too much work)
         */
  1:    incl PER_CPU_VAR(irq_count)
 -      jne 2f
 -      mov PER_CPU_VAR(irq_stack_ptr),%rsp
 +      cmovzq PER_CPU_VAR(irq_stack_ptr),%rsp
        CFI_DEF_CFA_REGISTER    rsi
  
 -2:    /* Store previous stack value */
 +      /* Store previous stack value */
        pushq %rsi
        CFI_ESCAPE      0x0f /* DW_CFA_def_cfa_expression */, 6, \
                        0x77 /* DW_OP_breg7 */, 0, \
@@@ -812,7 -813,7 +812,7 @@@ ret_from_intr
  
        /* Restore saved previous stack */
        popq %rsi
-       CFI_DEF_CFA_REGISTER    rsi
+       CFI_DEF_CFA rsi,SS+8-RBP        /* reg/off reset after def_cfa_expr */
        leaq ARGOFFSET-RBP(%rsi), %rsp
        CFI_DEF_CFA_REGISTER    rsp
        CFI_ADJUST_CFA_OFFSET   RBP-ARGOFFSET
@@@ -1529,20 -1530,12 +1529,20 @@@ ENTRY(nmi
  
        /* Use %rdx as out temp variable throughout */
        pushq_cfi %rdx
 +      CFI_REL_OFFSET rdx, 0
 +
 +      /*
 +       * If %cs was not the kernel segment, then the NMI triggered in user
 +       * space, which means it is definitely not nested.
 +       */
 +      cmpl $__KERNEL_CS, 16(%rsp)
 +      jne first_nmi
  
        /*
         * Check the special variable on the stack to see if NMIs are
         * executing.
         */
 -      cmp $1, -8(%rsp)
 +      cmpl $1, -8(%rsp)
        je nested_nmi
  
        /*
         */
        lea 6*8(%rsp), %rdx
        test_in_nmi rdx, 4*8(%rsp), nested_nmi, first_nmi
 +      CFI_REMEMBER_STATE
  
  nested_nmi:
        /*
  
  nested_nmi_out:
        popq_cfi %rdx
 +      CFI_RESTORE rdx
  
        /* No need to check faults here */
        INTERRUPT_RETURN
  
 +      CFI_RESTORE_STATE
  first_nmi:
        /*
         * Because nested NMIs will use the pushed location that we
         * | pt_regs                 |
         * +-------------------------+
         *
 -       * The saved RIP is used to fix up the copied RIP that a nested
 -       * NMI may zero out. The original stack frame and the temp storage
 +       * The saved stack frame is used to fix up the copied stack frame
 +       * that a nested NMI may change to make the interrupted NMI iret jump
 +       * to the repeat_nmi. The original stack frame and the temp storage
         * is also used by nested NMIs and can not be trusted on exit.
         */
 +      /* Do not pop rdx, nested NMIs will corrupt that part of the stack */
 +      movq (%rsp), %rdx
 +      CFI_RESTORE rdx
 +
        /* Set the NMI executing variable on the stack. */
        pushq_cfi $1
  
        .rept 5
        pushq_cfi 6*8(%rsp)
        .endr
 +      CFI_DEF_CFA_OFFSET SS+8-RIP
 +
 +      /* Everything up to here is safe from nested NMIs */
 +
 +      /*
 +       * If there was a nested NMI, the first NMI's iret will return
 +       * here. But NMIs are still enabled and we can take another
 +       * nested NMI. The nested NMI checks the interrupted RIP to see
 +       * if it is between repeat_nmi and end_repeat_nmi, and if so
 +       * it will just return, as we are about to repeat an NMI anyway.
 +       * This makes it safe to copy to the stack frame that a nested
 +       * NMI will update.
 +       */
 +repeat_nmi:
 +      /*
 +       * Update the stack variable to say we are still in NMI (the update
 +       * is benign for the non-repeat case, where 1 was pushed just above
 +       * to this very stack slot).
 +       */
 +      movq $1, 5*8(%rsp)
  
        /* Make another copy, this one may be modified by nested NMIs */
        .rept 5
        pushq_cfi 4*8(%rsp)
        .endr
 -
 -      /* Do not pop rdx, nested NMIs will corrupt it */
 -      movq 11*8(%rsp), %rdx
 +      CFI_DEF_CFA_OFFSET SS+8-RIP
 +end_repeat_nmi:
  
        /*
         * Everything below this point can be preempted by a nested
 -       * NMI if the first NMI took an exception. Repeated NMIs
 -       * caused by an exception and nested NMI will start here, and
 -       * can still be preempted by another NMI.
 +       * NMI if the first NMI took an exception and reset our iret stack
 +       * so that we repeat another NMI.
         */
 -restart_nmi:
        pushq_cfi $-1           /* ORIG_RAX: no syscall to restart */
        subq $ORIG_RAX-R15, %rsp
        CFI_ADJUST_CFA_OFFSET ORIG_RAX-R15
@@@ -1700,6 -1668,26 +1700,6 @@@ nmi_restore
        CFI_ENDPROC
  END(nmi)
  
 -      /*
 -       * If an NMI hit an iret because of an exception or breakpoint,
 -       * it can lose its NMI context, and a nested NMI may come in.
 -       * In that case, the nested NMI will change the preempted NMI's
 -       * stack to jump to here when it does the final iret.
 -       */
 -repeat_nmi:
 -      INTR_FRAME
 -      /* Update the stack variable to say we are still in NMI */
 -      movq $1, 5*8(%rsp)
 -
 -      /* copy the saved stack back to copy stack */
 -      .rept 5
 -      pushq_cfi 4*8(%rsp)
 -      .endr
 -
 -      jmp restart_nmi
 -      CFI_ENDPROC
 -end_repeat_nmi:
 -
  ENTRY(ignore_sysret)
        CFI_STARTPROC
        mov $-ENOSYS,%eax
index 6d5f54fcd2336b4b7408140869e3113c6707a2ca,257049d7c657cc56b40fc37e57aca7c402a90b70..dccebbe758ca4d90c996413f6c0a58e6b6f7920b
@@@ -291,6 -291,19 +291,6 @@@ notrace static void __cpuinit start_sec
        per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE;
        x86_platform.nmi_init();
  
 -      /*
 -       * Wait until the cpu which brought this one up marked it
 -       * online before enabling interrupts. If we don't do that then
 -       * we can end up waking up the softirq thread before this cpu
 -       * reached the active state, which makes the scheduler unhappy
 -       * and schedule the softirq thread on the wrong cpu. This is
 -       * only observable with forced threaded interrupts, but in
 -       * theory it could also happen w/o them. It's just way harder
 -       * to achieve.
 -       */
 -      while (!cpumask_test_cpu(smp_processor_id(), cpu_active_mask))
 -              cpu_relax();
 -
        /* enable local interrupts */
        local_irq_enable();
  
@@@ -727,6 -740,8 +727,6 @@@ do_rest
         * the targeted processor.
         */
  
 -      printk(KERN_DEBUG "smpboot cpu %d: start_ip = %lx\n", cpu, start_ip);
 -
        atomic_set(&init_deasserted, 0);
  
        if (get_uv_system_type() != UV_NON_UNIQUE_APIC) {
                        schedule();
                }
  
-               if (cpumask_test_cpu(cpu, cpu_callin_mask))
+               if (cpumask_test_cpu(cpu, cpu_callin_mask)) {
+                       print_cpu_msr(&cpu_data(cpu));
                        pr_debug("CPU%d: has booted.\n", cpu);
-               else {
+               else {
                        boot_error = 1;
                        if (*(volatile u32 *)TRAMPOLINE_SYM(trampoline_status)
                            == 0xA5A5A5A5)