Merge branch 'linux-next' of git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes...
[pandora-kernel.git] / include / asm-x86 / pda.h
index c0305bf..b34e9a7 100644 (file)
@@ -22,7 +22,8 @@ struct x8664_pda {
                                           offset 40!!! */
 #endif
        char *irqstackptr;
-       unsigned int nodenumber;        /* number of current node */
+       short nodenumber;               /* number of current node (32k max) */
+       short in_bootmem;               /* pda lives in bootmem */
        unsigned int __softirq_pending;
        unsigned int __nmi_count;       /* number of NMI on this CPUs */
        short mmu_state;
@@ -38,8 +39,7 @@ struct x8664_pda {
        unsigned irq_spurious_count;
 } ____cacheline_aligned_in_smp;
 
-extern struct x8664_pda *_cpu_pda[];
-extern struct x8664_pda boot_cpu_pda[];
+extern struct x8664_pda **_cpu_pda;
 extern void pda_init(int);
 
 #define cpu_pda(i) (_cpu_pda[i])
@@ -58,34 +58,36 @@ extern struct x8664_pda _proxy_pda;
 
 #define pda_offset(field) offsetof(struct x8664_pda, field)
 
-#define pda_to_op(op, field, val) do {         \
-       typedef typeof(_proxy_pda.field) T__;   \
-       if (0) { T__ tmp__; tmp__ = (val); }    /* type checking */ \
-       switch (sizeof(_proxy_pda.field)) {     \
-       case 2:                                 \
-               asm(op "w %1,%%gs:%c2" :        \
-                   "+m" (_proxy_pda.field) :   \
-                   "ri" ((T__)val),            \
-                   "i"(pda_offset(field)));    \
-               break;                          \
-       case 4:                                 \
-               asm(op "l %1,%%gs:%c2" :        \
-                   "+m" (_proxy_pda.field) :   \
-                   "ri" ((T__)val),            \
-                   "i" (pda_offset(field)));   \
-               break;                          \
-       case 8:                                 \
-               asm(op "q %1,%%gs:%c2":         \
-                   "+m" (_proxy_pda.field) :   \
-                   "ri" ((T__)val),            \
-                   "i"(pda_offset(field)));    \
-               break;                          \
-       default:                                \
-               __bad_pda_field();              \
-       }                                       \
-       } while (0)
+#define pda_to_op(op, field, val)                                      \
+do {                                                                   \
+       typedef typeof(_proxy_pda.field) T__;                           \
+       if (0) { T__ tmp__; tmp__ = (val); }    /* type checking */     \
+       switch (sizeof(_proxy_pda.field)) {                             \
+       case 2:                                                         \
+               asm(op "w %1,%%gs:%c2" :                                \
+                   "+m" (_proxy_pda.field) :                           \
+                   "ri" ((T__)val),                                    \
+                   "i"(pda_offset(field)));                            \
+               break;                                                  \
+       case 4:                                                         \
+               asm(op "l %1,%%gs:%c2" :                                \
+                   "+m" (_proxy_pda.field) :                           \
+                   "ri" ((T__)val),                                    \
+                   "i" (pda_offset(field)));                           \
+               break;                                                  \
+       case 8:                                                         \
+               asm(op "q %1,%%gs:%c2":                                 \
+                   "+m" (_proxy_pda.field) :                           \
+                   "ri" ((T__)val),                                    \
+                   "i"(pda_offset(field)));                            \
+               break;                                                  \
+       default:                                                        \
+               __bad_pda_field();                                      \
+       }                                                               \
+} while (0)
 
-#define pda_from_op(op,field) ({               \
+#define pda_from_op(op, field)                 \
+({                                             \
        typeof(_proxy_pda.field) ret__;         \
        switch (sizeof(_proxy_pda.field)) {     \
        case 2:                                 \
@@ -93,23 +95,24 @@ extern struct x8664_pda _proxy_pda;
                    "=r" (ret__) :              \
                    "i" (pda_offset(field)),    \
                    "m" (_proxy_pda.field));    \
-                break;                         \
+               break;                          \
        case 4:                                 \
                asm(op "l %%gs:%c1,%0":         \
                    "=r" (ret__):               \
                    "i" (pda_offset(field)),    \
                    "m" (_proxy_pda.field));    \
-                break;                         \
+               break;                          \
        case 8:                                 \
                asm(op "q %%gs:%c1,%0":         \
                    "=r" (ret__) :              \
                    "i" (pda_offset(field)),    \
                    "m" (_proxy_pda.field));    \
-                break;                         \
+               break;                          \
        default:                                \
                __bad_pda_field();              \
-       }                                       \
-       ret__; })
+       }                                       \
+       ret__;                                  \
+})
 
 #define read_pda(field)                pda_from_op("mov", field)
 #define write_pda(field, val)  pda_to_op("mov", field, val)
@@ -118,12 +121,13 @@ extern struct x8664_pda _proxy_pda;
 #define or_pda(field, val)     pda_to_op("or", field, val)
 
 /* This is not atomic against other CPUs -- CPU preemption needs to be off */
-#define test_and_clear_bit_pda(bit, field) ({          \
-       int old__;                                              \
-       asm volatile("btr %2,%%gs:%c3\n\tsbbl %0,%0"            \
-           : "=r" (old__), "+m" (_proxy_pda.field)             \
-           : "dIr" (bit), "i" (pda_offset(field)) : "memory"); \
-       old__;                                                  \
+#define test_and_clear_bit_pda(bit, field)                             \
+({                                                                     \
+       int old__;                                                      \
+       asm volatile("btr %2,%%gs:%c3\n\tsbbl %0,%0"                    \
+                    : "=r" (old__), "+m" (_proxy_pda.field)            \
+                    : "dIr" (bit), "i" (pda_offset(field)) : "memory");\
+       old__;                                                          \
 })
 
 #endif