From: Christopher James Halse Rogers <[email protected]>

Because the address of a thread-local variable is no longer
a known fixed offset from the TCB it is not possible to run-time
patch the dispatch table to load _glapi_tls_Dispatch with an
immediate instruction.
---
 src/mapi/glapi/gen/gl_x86_asm.py  |   19 ++++++++-----------
 src/mapi/glapi/glapi_entrypoint.c |   15 ---------------
 2 files changed, 8 insertions(+), 26 deletions(-)

diff --git a/src/mapi/glapi/gen/gl_x86_asm.py b/src/mapi/glapi/gen/gl_x86_asm.py
index 4ef4acb..cafc0c0 100644
--- a/src/mapi/glapi/gen/gl_x86_asm.py
+++ b/src/mapi/glapi/gen/gl_x86_asm.py
@@ -84,18 +84,11 @@ class PrintGenericStubs(gl_XML.gl_print_base):
                print ''
                print '#ifdef GLX_USE_TLS'
                print ''
-               print '#ifdef GLX_X86_READONLY_TEXT'
-               print '# define CTX_INSNS MOV_L(GS:(EAX), EAX)'
-               print '#else'
-               print '# define CTX_INSNS NOP /* Pad for init_glapi_relocs() */'
-               print '#endif'
-               print ''
                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 '\tCALL(_x86_get_dispatch) ;\t\t\t\\'
-               print '\tCTX_INSNS ;                                    \\'
                print '\tJMP(GL_OFFSET(off))'
                print ''
                print '#elif defined(PTHREADS)'
@@ -146,10 +139,14 @@ class PrintGenericStubs(gl_XML.gl_print_base):
                print '\tHIDDEN(GLNAME(_x86_get_dispatch))'
                print 'ALIGNTEXT16'
                print 'GLNAME(_x86_get_dispatch):'
-               print '\tcall   1f'
-               print '1:\tpopl %eax'
-               print '\taddl   $_GLOBAL_OFFSET_TABLE_+[.-1b], %eax'
-               print '\tmovl   _glapi_tls_Dispatch@GOTNTPOFF(%eax), %eax'
+               print '\tpushl\t%ebx'
+               print '\tcall\t1f'
+               print '1:\tpopl\t%ebx'
+               print '\taddl\t$_GLOBAL_OFFSET_TABLE_+[.-1b], %ebx'
+               print '\tleal\t_glapi_tls_Dispatch@tlsgd(,%ebx,1), %eax'
+               print '\tcall\t___tls_get_addr@plt'
+               print '\tmovl\t(%eax),%eax'
+               print '\tpopl\t%ebx'
                print '\tret'
                print ''
                print '#elif defined(PTHREADS)'
diff --git a/src/mapi/glapi/glapi_entrypoint.c 
b/src/mapi/glapi/glapi_entrypoint.c
index 993ccb94..d3fdb81 100644
--- a/src/mapi/glapi/glapi_entrypoint.c
+++ b/src/mapi/glapi/glapi_entrypoint.c
@@ -65,21 +65,6 @@ get_entrypoint_address(unsigned int functionOffset)
 static void
 init_glapi_relocs( void )
 {
-#if defined(GLX_USE_TLS) && !defined(GLX_X86_READONLY_TEXT)
-    extern unsigned long _x86_get_dispatch(void);
-    char run_time_patch[] = {
-       0x65, 0xa1, 0, 0, 0, 0 /* movl %gs:0,%eax */
-    };
-    GLuint *offset = (GLuint *) &run_time_patch[2]; /* 32-bits for x86/32 */
-    const GLubyte * const get_disp = (const GLubyte *) run_time_patch;
-    GLubyte * curr_func = (GLubyte *) gl_dispatch_functions_start;
-
-    *offset = _x86_get_dispatch();
-    while ( curr_func != (GLubyte *) gl_dispatch_functions_end ) {
-       (void) memcpy( curr_func, get_disp, sizeof(run_time_patch));
-       curr_func += DISPATCH_FUNCTION_SIZE;
-    }
-#endif
 }
 
 
-- 
1.7.4.1

_______________________________________________
mesa-dev mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to