X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmapi%2Fentry_x86-64_tls.h;h=1e29bde516c356c3eb8480ee26691a5a1e679044;hb=18124d727865f1c53b0dac644560bce177b7d233;hp=5c03b045606c484547dd1c7624ce7e57498fb431;hpb=c3f352e8367f03cc416968d780f5dc6a6812a496;p=mesa.git diff --git a/src/mapi/entry_x86-64_tls.h b/src/mapi/entry_x86-64_tls.h index 5c03b045606..1e29bde516c 100644 --- a/src/mapi/entry_x86-64_tls.h +++ b/src/mapi/entry_x86-64_tls.h @@ -25,6 +25,11 @@ * Chia-I Wu */ +#ifdef HAVE_FUNC_ATTRIBUTE_VISIBILITY +#define HIDDEN __attribute__((visibility("hidden"))) +#else +#define HIDDEN +#endif __asm__(".text\n" ".balign 32\n" @@ -36,23 +41,28 @@ __asm__(".text\n" ".balign 32\n" \ func ":" +#ifndef __ILP32__ + #define STUB_ASM_CODE(slot) \ "movq " ENTRY_CURRENT_TABLE "@GOTTPOFF(%rip), %rax\n\t" \ "movq %fs:(%rax), %r11\n\t" \ "jmp *(8 * " slot ")(%r11)" +#else + +#define STUB_ASM_CODE(slot) \ + "movq " ENTRY_CURRENT_TABLE "@GOTTPOFF(%rip), %rax\n\t" \ + "movl %fs:(%rax), %r11d\n\t" \ + "movl 4*" slot "(%r11d), %r11d\n\t" \ + "jmp *%r11" + +#endif + #define MAPI_TMP_STUB_ASM_GCC #include "mapi_tmp.h" #ifndef MAPI_MODE_BRIDGE -__asm__("x86_64_current_tls:\n\t" - "movq " ENTRY_CURRENT_TABLE "@GOTTPOFF(%rip), %rax\n\t" - "ret"); - -extern unsigned long -x86_64_current_tls(); - #include #include "u_execmem.h" @@ -61,8 +71,8 @@ entry_patch_public(void) { } -static char -x86_64_entry_start[]; +extern char +x86_64_entry_start[] HIDDEN; mapi_func entry_get_public(int slot) @@ -74,23 +84,37 @@ void entry_patch(mapi_func entry, int slot) { char *code = (char *) entry; - *((unsigned int *) (code + 12)) = slot * sizeof(mapi_func); + int offset = 12; +#ifdef __ILP32__ + offset = 13; +#endif + *((unsigned int *) (code + offset)) = slot * sizeof(mapi_func); } mapi_func entry_generate(int slot) { - const char code_templ[16] = { + const char code_templ[] = { +#ifndef __ILP32__ /* movq %fs:0, %r11 */ 0x64, 0x4c, 0x8b, 0x1c, 0x25, 0x00, 0x00, 0x00, 0x00, /* jmp *0x1234(%r11) */ 0x41, 0xff, 0xa3, 0x34, 0x12, 0x00, 0x00, +#else + /* movl %fs:0, %r11d */ + 0x64, 0x44, 0x8b, 0x1c, 0x25, 0x00, 0x00, 0x00, 0x00, + /* movl 0x1234(%r11d), %r11d */ + 0x67, 0x45, 0x8b, 0x9b, 0x34, 0x12, 0x00, 0x00, + /* jmp *%r11 */ + 0x41, 0xff, 0xe3, +#endif }; - unsigned long addr; + unsigned long long addr; char *code; mapi_func entry; - addr = x86_64_current_tls(); + __asm__("movq " ENTRY_CURRENT_TABLE "@GOTTPOFF(%%rip), %0" + : "=r" (addr)); if ((addr >> 32) != 0xffffffff) return NULL; addr &= 0xffffffff;