Mesa (main): Fix TSD stubs for non-initial-exec case (fixes #5667).

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Dec 8 05:40:36 UTC 2021


Module: Mesa
Branch: main
Commit: 3aab34171d464f907ed4488ab87c48270381ecde
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=3aab34171d464f907ed4488ab87c48270381ecde

Author: Alex Xu (Hello71) <alex_y_xu at yahoo.ca>
Date:   Tue Nov 23 15:24:38 2021 -0500

Fix TSD stubs for non-initial-exec case (fixes #5667).

ppc64le TSD disabled for now since I am insufficiently familiar with ppc
asm. x86 pthread stubs deleted because adding USE_ELF_TLS to the #if is
isn't worth the effort since it only saves a single function call on
initial entry (TSD stubs are not used for read-only text now). also
potentially fix non-pthread TSD builds (_glapi_Dispatch was undefined),
but untested (could still be broken).

Tested-by: Jesse Natalie <jenatali at microsoft.com>
Tested-by: Jan Beich <jbeich at freebsd.org>
Signed-off-by: Alex Xu (Hello71) <alex_y_xu at yahoo.ca>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13935>

---

 src/mapi/entry.c                 |  5 ++---
 src/mapi/entry_x86_tsd.h         |  2 +-
 src/mapi/glapi/gen/gl_x86_asm.py | 28 +++-------------------------
 3 files changed, 6 insertions(+), 29 deletions(-)

diff --git a/src/mapi/entry.c b/src/mapi/entry.c
index b120eae31a1..5ebd85011c6 100644
--- a/src/mapi/entry.c
+++ b/src/mapi/entry.c
@@ -47,8 +47,6 @@
 #endif
 
 /* REALLY_INITIAL_EXEC implies USE_ELF_TLS and __GNUC__ */
-/* Use TSD stubs for non-IE ELF TLS even though first access is slower because
- * future accesses will be patched */
 #if defined(USE_X86_ASM) && defined(REALLY_INITIAL_EXEC)
 #include "entry_x86_tls.h"
 #elif defined(USE_X86_ASM) && !defined(GLX_X86_READONLY_TEXT) && defined(__GNUC__)
@@ -57,7 +55,8 @@
 #include "entry_x86-64_tls.h"
 #elif defined(USE_PPC64LE_ASM) && UTIL_ARCH_LITTLE_ENDIAN && defined(REALLY_INITIAL_EXEC)
 #include "entry_ppc64le_tls.h"
-#elif defined(USE_PPC64LE_ASM) && UTIL_ARCH_LITTLE_ENDIAN && defined(__GNUC__)
+/* ppc64le non-IE TSD stubs are possible but not currently implemented */
+#elif defined(USE_PPC64LE_ASM) && UTIL_ARCH_LITTLE_ENDIAN && !defined(USE_ELF_TLS) && defined(__GNUC__)
 #include "entry_ppc64le_tsd.h"
 #else
 
diff --git a/src/mapi/entry_x86_tsd.h b/src/mapi/entry_x86_tsd.h
index f5d9c41253f..2aa724a70f3 100644
--- a/src/mapi/entry_x86_tsd.h
+++ b/src/mapi/entry_x86_tsd.h
@@ -69,7 +69,7 @@ __asm__(".balign 32\n"
    "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" \
+   "movl _glapi_Dispatch at GOT(%ecx), %eax\n\t" \
    "mov (%eax), %eax\n\t"           \
    "testl %eax, %eax\n\t"           \
    "jne 1f\n\t"                     \
diff --git a/src/mapi/glapi/gen/gl_x86_asm.py b/src/mapi/glapi/gen/gl_x86_asm.py
index 4b10db37d7f..057aa54ba3f 100644
--- a/src/mapi/glapi/gen/gl_x86_asm.py
+++ b/src/mapi/glapi/gen/gl_x86_asm.py
@@ -70,7 +70,7 @@ class PrintGenericStubs(gl_XML.gl_print_base):
         print('#endif')
         print('')
         print('')
-        print('#ifdef USE_ELF_TLS')
+        print('#ifdef REALLY_INITIAL_EXEC')
         print('')
         print('#ifdef GLX_X86_READONLY_TEXT')
         print('# define CTX_INSNS MOV_L(GS:(EAX), EAX)')
@@ -86,17 +86,6 @@ class PrintGenericStubs(gl_XML.gl_print_base):
         print('\tCTX_INSNS ;					\\')
         print('\tJMP(GL_OFFSET(off))')
         print('')
-        print('#elif defined(HAVE_PTHREAD)')
-        print('#  define GL_STUB(fn,off,fn_alt)\t\t\t\\')
-        print('ALIGNTEXT16;\t\t\t\t\t\t\\')
-        print('GLOBL_FN(GL_PREFIX(fn, fn_alt));\t\t\t\\')
-        print('GL_PREFIX(fn, fn_alt):\t\t\t\t\t\\')
-        print('\tMOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) ;\t\\')
-        print('\tTEST_L(EAX, EAX) ;\t\t\t\t\\')
-        print('\tJE(1f) ;\t\t\t\t\t\\')
-        print('\tJMP(GL_OFFSET(off)) ;\t\t\t\t\\')
-        print('1:\tCALL(_x86_get_dispatch) ;\t\t\t\\')
-        print('\tJMP(GL_OFFSET(off))')
         print('#else')
         print('#  define GL_STUB(fn,off,fn_alt)\t\t\t\\')
         print('ALIGNTEXT16;\t\t\t\t\t\t\\')
@@ -121,7 +110,7 @@ class PrintGenericStubs(gl_XML.gl_print_base):
         print('')
         print('SEG_TEXT')
         print('')
-        print('#ifdef USE_ELF_TLS')
+        print('#ifdef REALLY_INITIAL_EXEC')
         print('')
         print('\tGLOBL\tGLNAME(_x86_get_dispatch)')
         print('\tHIDDEN(GLNAME(_x86_get_dispatch))')
@@ -133,19 +122,8 @@ class PrintGenericStubs(gl_XML.gl_print_base):
         print('\tmovl	_glapi_tls_Dispatch at GOTNTPOFF(%eax), %eax')
         print('\tret')
         print('')
-        print('#elif defined(HAVE_PTHREAD)')
-        print('EXTERN GLNAME(_glapi_Dispatch)')
-        print('EXTERN GLNAME(_gl_DispatchTSD)')
-        print('EXTERN GLNAME(pthread_getspecific)')
-        print('')
-        print('ALIGNTEXT16')
-        print('GLNAME(_x86_get_dispatch):')
-        print('\tSUB_L(CONST(24), ESP)')
-        print('\tPUSH_L(GLNAME(_gl_DispatchTSD))')
-        print('\tCALL(GLNAME(pthread_getspecific))')
-        print('\tADD_L(CONST(28), ESP)')
-        print('\tRET')
         print('#else')
+        print('EXTERN GLNAME(_glapi_Dispatch)')
         print('EXTERN GLNAME(_glapi_get_dispatch)')
         print('#endif')
         print('')



More information about the mesa-commit mailing list