Merge branch 'linus' into perfcounters/core
[linux-drm-fsl-dcu.git] / arch / x86 / include / asm / processor.h
index 3bfd5235a9eb46dbf5e1386cf8ba34b6e8765066..c15766a2969fd0dd45af1eae94632798739884ed 100644 (file)
@@ -378,6 +378,30 @@ union thread_xstate {
 
 #ifdef CONFIG_X86_64
 DECLARE_PER_CPU(struct orig_ist, orig_ist);
+
+union irq_stack_union {
+       char irq_stack[IRQ_STACK_SIZE];
+       /*
+        * GCC hardcodes the stack canary as %gs:40.  Since the
+        * irq_stack is the object at %gs:0, we reserve the bottom
+        * 48 bytes of the irq stack for the canary.
+        */
+       struct {
+               char gs_base[40];
+               unsigned long stack_canary;
+       };
+};
+
+DECLARE_PER_CPU(union irq_stack_union, irq_stack_union);
+DECLARE_PER_CPU(char *, irq_stack_ptr);
+
+static inline void load_gs_base(int cpu)
+{
+       /* Memory clobbers used to order pda/percpu accesses */
+       mb();
+       wrmsrl(MSR_GS_BASE, (unsigned long)per_cpu(irq_stack_union.gs_base, cpu));
+       mb();
+}
 #endif
 
 extern void print_cpu_info(struct cpuinfo_x86 *);