Loading include/asm-x86_64/pda.h +53 −32 Original line number Original line Diff line number Diff line Loading @@ -41,26 +41,38 @@ extern struct x8664_pda boot_cpu_pda[]; */ */ extern void __bad_pda_field(void); extern void __bad_pda_field(void); /* proxy_pda doesn't actually exist, but tell gcc it is accessed /* for all PDA accesses so it gets read/write dependencies right. */ * proxy_pda doesn't actually exist, but tell gcc it is accessed for * all PDA accesses so it gets read/write dependencies right. */ extern struct x8664_pda _proxy_pda; extern struct x8664_pda _proxy_pda; #define pda_offset(field) offsetof(struct x8664_pda, field) #define pda_offset(field) offsetof(struct x8664_pda, field) #define pda_to_op(op,field,val) do { \ #define pda_to_op(op,field,val) do { \ typedef typeof(_proxy_pda.field) T__; \ typedef typeof(_proxy_pda.field) T__; \ if (0) { T__ tmp__; tmp__ = (val); } \ if (0) { T__ tmp__; tmp__ = (val); } /* type checking */ \ switch (sizeof(_proxy_pda.field)) { \ switch (sizeof(_proxy_pda.field)) { \ case 2: \ case 2: \ asm(op "w %1,%%gs:%c2" : "+m" (_proxy_pda.field) : \ asm(op "w %1,%%gs:%c2" : \ "ri" ((T__)val),"i"(pda_offset(field))); break; \ "+m" (_proxy_pda.field) : \ "ri" ((T__)val), \ "i"(pda_offset(field))); \ break; \ case 4: \ case 4: \ asm(op "l %1,%%gs:%c2" : "+m" (_proxy_pda.field) : \ asm(op "l %1,%%gs:%c2" : \ "ri" ((T__)val),"i"(pda_offset(field))); break; \ "+m" (_proxy_pda.field) : \ "ri" ((T__)val), \ "i" (pda_offset(field))); \ break; \ case 8: \ case 8: \ asm(op "q %1,%%gs:%c2": "+m" (_proxy_pda.field) : \ asm(op "q %1,%%gs:%c2": \ "ri" ((T__)val),"i"(pda_offset(field))); break; \ "+m" (_proxy_pda.field) : \ default: __bad_pda_field(); \ "ri" ((T__)val), \ "i"(pda_offset(field))); \ break; \ default: \ __bad_pda_field(); \ } \ } \ } while (0) } while (0) Loading @@ -68,19 +80,28 @@ default: __bad_pda_field(); \ typeof(_proxy_pda.field) ret__; \ typeof(_proxy_pda.field) ret__; \ switch (sizeof(_proxy_pda.field)) { \ switch (sizeof(_proxy_pda.field)) { \ case 2: \ case 2: \ asm(op "w %%gs:%c1,%0":"=r" (ret__):\ asm(op "w %%gs:%c1,%0" : \ "i" (pda_offset(field)), "m" (_proxy_pda.field)); break;\ "=r" (ret__) : \ "i" (pda_offset(field)), \ "m" (_proxy_pda.field)); \ break; \ case 4: \ case 4: \ asm(op "l %%gs:%c1,%0":"=r" (ret__):\ asm(op "l %%gs:%c1,%0": \ "i" (pda_offset(field)), "m" (_proxy_pda.field)); break;\ "=r" (ret__): \ "i" (pda_offset(field)), \ "m" (_proxy_pda.field)); \ break; \ case 8: \ case 8: \ asm(op "q %%gs:%c1,%0":"=r" (ret__):\ asm(op "q %%gs:%c1,%0": \ "i" (pda_offset(field)), "m" (_proxy_pda.field)); break;\ "=r" (ret__) : \ default: __bad_pda_field(); \ "i" (pda_offset(field)), \ "m" (_proxy_pda.field)); \ break; \ default: \ __bad_pda_field(); \ } \ } \ ret__; }) ret__; }) #define read_pda(field) pda_from_op("mov",field) #define read_pda(field) pda_from_op("mov",field) #define write_pda(field,val) pda_to_op("mov",field,val) #define write_pda(field,val) pda_to_op("mov",field,val) #define add_pda(field,val) pda_to_op("add",field,val) #define add_pda(field,val) pda_to_op("add",field,val) Loading Loading
include/asm-x86_64/pda.h +53 −32 Original line number Original line Diff line number Diff line Loading @@ -41,26 +41,38 @@ extern struct x8664_pda boot_cpu_pda[]; */ */ extern void __bad_pda_field(void); extern void __bad_pda_field(void); /* proxy_pda doesn't actually exist, but tell gcc it is accessed /* for all PDA accesses so it gets read/write dependencies right. */ * proxy_pda doesn't actually exist, but tell gcc it is accessed for * all PDA accesses so it gets read/write dependencies right. */ extern struct x8664_pda _proxy_pda; extern struct x8664_pda _proxy_pda; #define pda_offset(field) offsetof(struct x8664_pda, field) #define pda_offset(field) offsetof(struct x8664_pda, field) #define pda_to_op(op,field,val) do { \ #define pda_to_op(op,field,val) do { \ typedef typeof(_proxy_pda.field) T__; \ typedef typeof(_proxy_pda.field) T__; \ if (0) { T__ tmp__; tmp__ = (val); } \ if (0) { T__ tmp__; tmp__ = (val); } /* type checking */ \ switch (sizeof(_proxy_pda.field)) { \ switch (sizeof(_proxy_pda.field)) { \ case 2: \ case 2: \ asm(op "w %1,%%gs:%c2" : "+m" (_proxy_pda.field) : \ asm(op "w %1,%%gs:%c2" : \ "ri" ((T__)val),"i"(pda_offset(field))); break; \ "+m" (_proxy_pda.field) : \ "ri" ((T__)val), \ "i"(pda_offset(field))); \ break; \ case 4: \ case 4: \ asm(op "l %1,%%gs:%c2" : "+m" (_proxy_pda.field) : \ asm(op "l %1,%%gs:%c2" : \ "ri" ((T__)val),"i"(pda_offset(field))); break; \ "+m" (_proxy_pda.field) : \ "ri" ((T__)val), \ "i" (pda_offset(field))); \ break; \ case 8: \ case 8: \ asm(op "q %1,%%gs:%c2": "+m" (_proxy_pda.field) : \ asm(op "q %1,%%gs:%c2": \ "ri" ((T__)val),"i"(pda_offset(field))); break; \ "+m" (_proxy_pda.field) : \ default: __bad_pda_field(); \ "ri" ((T__)val), \ "i"(pda_offset(field))); \ break; \ default: \ __bad_pda_field(); \ } \ } \ } while (0) } while (0) Loading @@ -68,19 +80,28 @@ default: __bad_pda_field(); \ typeof(_proxy_pda.field) ret__; \ typeof(_proxy_pda.field) ret__; \ switch (sizeof(_proxy_pda.field)) { \ switch (sizeof(_proxy_pda.field)) { \ case 2: \ case 2: \ asm(op "w %%gs:%c1,%0":"=r" (ret__):\ asm(op "w %%gs:%c1,%0" : \ "i" (pda_offset(field)), "m" (_proxy_pda.field)); break;\ "=r" (ret__) : \ "i" (pda_offset(field)), \ "m" (_proxy_pda.field)); \ break; \ case 4: \ case 4: \ asm(op "l %%gs:%c1,%0":"=r" (ret__):\ asm(op "l %%gs:%c1,%0": \ "i" (pda_offset(field)), "m" (_proxy_pda.field)); break;\ "=r" (ret__): \ "i" (pda_offset(field)), \ "m" (_proxy_pda.field)); \ break; \ case 8: \ case 8: \ asm(op "q %%gs:%c1,%0":"=r" (ret__):\ asm(op "q %%gs:%c1,%0": \ "i" (pda_offset(field)), "m" (_proxy_pda.field)); break;\ "=r" (ret__) : \ default: __bad_pda_field(); \ "i" (pda_offset(field)), \ "m" (_proxy_pda.field)); \ break; \ default: \ __bad_pda_field(); \ } \ } \ ret__; }) ret__; }) #define read_pda(field) pda_from_op("mov",field) #define read_pda(field) pda_from_op("mov",field) #define write_pda(field,val) pda_to_op("mov",field,val) #define write_pda(field,val) pda_to_op("mov",field,val) #define add_pda(field,val) pda_to_op("add",field,val) #define add_pda(field,val) pda_to_op("add",field,val) Loading