From 66482303f6d19f1e498b31626c3cbae75e44e957 Mon Sep 17 00:00:00 2001 From: Lepton Wu Date: Mon, 22 Jun 2020 15:33:32 -0700 Subject: [PATCH] mapi: x86: Fix dynamic entries in x86 tsd stubs. We need to update dynamic entries related code after updating asm stubs. Fixes: 45206d7673a ("mapi: Adapted libglvnd x86 tsd changes") Signed-off-by: Lepton Wu Part-of: --- src/mapi/entry_x86_tsd.h | 50 +++++++++++++++++++++++++++++++++------- 1 file changed, 42 insertions(+), 8 deletions(-) diff --git a/src/mapi/entry_x86_tsd.h b/src/mapi/entry_x86_tsd.h index 1cf3ea2964e..f5d9c41253f 100644 --- a/src/mapi/entry_x86_tsd.h +++ b/src/mapi/entry_x86_tsd.h @@ -39,8 +39,16 @@ #define X86_ENTRY_SIZE 64 -__asm__(".text\n" - ".balign 32\n" +__asm__(".text\n"); + +__asm__("x86_got:\n\t" + "call 1f\n" + "1:\n\t" + "popl %eax\n\t" + "addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %eax\n\t" + "ret"); + +__asm__(".balign 32\n" "x86_entry_start:"); #define STUB_ASM_ENTRY(func) \ @@ -49,12 +57,18 @@ __asm__(".text\n" ".balign 32\n" \ func ":" +#define LOC_BEGIN_SET_ECX +#define LOC_END_SET_ECX +#define LOC_END_JMP + #define STUB_ASM_CODE(slot) \ ENDBR \ + LOC_BEGIN_SET_ECX \ "call 1f\n\t" \ "1:\n\t" \ "popl %ecx\n\t" \ "addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ecx\n\t" \ + LOC_END_SET_ECX \ "movl " ENTRY_CURRENT_TABLE "@GOT(%ecx), %eax\n\t" \ "mov (%eax), %eax\n\t" \ "testl %eax, %eax\n\t" \ @@ -64,7 +78,8 @@ __asm__(".text\n" "call " ENTRY_CURRENT_TABLE_GET "@PLT\n\t" \ "popl %ebx\n\t" \ "1:\n\t" \ - "jmp *(4 * " slot ")(%eax)" + "jmp *(4 * " slot ")(%eax)\n\t" \ + LOC_END_JMP #define MAPI_TMP_STUB_ASM_GCC #include "mapi_tmp.h" @@ -74,9 +89,26 @@ __asm__(".text\n" __asm__(".balign 32\n" "x86_entry_end:"); +#undef LOC_BEGIN_SET_ECX +#undef LOC_END_SET_ECX +#undef LOC_END_JMP +#define LOC_BEGIN_SET_ECX "jmp set_ecx\n\t" +#define LOC_END_SET_ECX "set_ecx:movl $0x12345678, %ecx\n\tloc_end_set_ecx:\n\t" +#define LOC_END_JMP "loc_end_jmp:" + +/* Any number big enough works. This is to make sure the final + * jmp is a long jmp */ +__asm__(STUB_ASM_CODE("10000")); + +extern const char loc_end_set_ecx[] HIDDEN; +extern const char loc_end_jmp[] HIDDEN; + #include #include "u_execmem.h" +extern unsigned long +x86_got(); + extern const char x86_entry_start[] HIDDEN; extern const char x86_entry_end[] HIDDEN; @@ -95,16 +127,15 @@ void entry_patch(mapi_func entry, int slot) { char *code = (char *) entry; - - *((unsigned long *) (code + 11)) = slot * sizeof(mapi_func); - *((unsigned long *) (code + 22)) = slot * sizeof(mapi_func); + int offset = loc_end_jmp - x86_entry_end - sizeof(unsigned long); + *((unsigned long *) (code + offset)) = slot * sizeof(mapi_func); } mapi_func entry_generate(int slot) { - const char *code_templ = x86_entry_end - X86_ENTRY_SIZE; - void *code; + const char *code_templ = x86_entry_end; + char *code; mapi_func entry; code = u_execmem_alloc(X86_ENTRY_SIZE); @@ -113,6 +144,9 @@ entry_generate(int slot) memcpy(code, code_templ, X86_ENTRY_SIZE); entry = (mapi_func) code; + int ecx_value_off = loc_end_set_ecx - x86_entry_end - sizeof(unsigned long); + *((unsigned long *) (code + ecx_value_off)) = x86_got(); + entry_patch(entry, slot); return entry; -- 2.30.2