[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

X Strike Force XFree86 SVN commit: r1236 - in trunk/debian: . patches



Author: branden
Date: 2004-04-11 22:34:43 -0500 (Sun, 11 Apr 2004)
New Revision: 1236

Added:
   trunk/debian/patches/104_sparc_fix_GL_library.diff
Modified:
   trunk/debian/changelog
Log:
Fix SEGV when attempting to use GLX extension on SPARC due to failure of
extension to initialize a Mesa context; patch by Ferris McCormick,
backported from XFree86 CVS by Christian Guggenberger.  (Closes: #241331)


Modified: trunk/debian/changelog
===================================================================
--- trunk/debian/changelog	2004-04-12 03:24:53 UTC (rev 1235)
+++ trunk/debian/changelog	2004-04-12 03:34:43 UTC (rev 1236)
@@ -154,8 +154,12 @@
     + Use shell's && and || operators instead of test(1)'s -a and -o operators,
       since the former is POSIX-compliant and the latter is not.
 
- -- Branden Robinson <branden@debian.org>  Sun, 11 Apr 2004 19:13:49 -0500
+  * Fix SEGV when attempting to use GLX extension on SPARC due to failure of
+    extension to initialize a Mesa context; patch by Ferris McCormick,
+    backported from XFree86 CVS by Christian Guggenberger.  (Closes: #241331)
 
+ -- Branden Robinson <branden@debian.org>  Sun, 11 Apr 2004 22:31:25 -0500
+
 xfree86 (4.3.0-7) unstable; urgency=medium
 
   * Urgency due to fix for FTBFS.  Yes -- I too am begging for it to stop.

Added: trunk/debian/patches/104_sparc_fix_GL_library.diff
===================================================================
--- trunk/debian/patches/104_sparc_fix_GL_library.diff	2004-04-12 03:24:53 UTC (rev 1235)
+++ trunk/debian/patches/104_sparc_fix_GL_library.diff	2004-04-12 03:34:43 UTC (rev 1236)
@@ -0,0 +1,135 @@
+$Id$
+
+As XFree86 puts it:
+
+  Fix sparc asm glapi initialisation in libGL when using indirect rendering
+  (GLX) (Bugzilla #923, Ferris McCormick).
+
+Also see Debian #241331.
+
+This was adapted from revision 1.22 of xc/lib/GL/glx/glxext.c in XFree86
+CVS.
+
+This patch by Ferris McCormick.
+
+--- xc/lib/GL/glx/glxext.c~	2004-04-11 19:24:43.000000000 -0500
++++ xc/lib/GL/glx/glxext.c	2004-04-11 19:27:35.000000000 -0500
+@@ -58,6 +58,37 @@
+ void __glXDumpDrawBuffer(__GLXcontext *ctx);
+ #endif
+ 
++#ifdef USE_SPARC_ASM
++/*
++ * This is where our dispatch table's bounds are.
++ * And the static mesa_init is taken directly from
++ * Mesa's 'sparc.c' initializer.
++ *
++ * We need something like this here, because this version
++ * of openGL/glx never initializes a Mesa context, and so
++ * the address of the dispatch table pointer never gets stuffed
++ * into the dispatch jump table otherwise.
++ *
++ * It matters only on SPARC, and only if you are using assembler
++ * code instead of C-code indirect dispatch.
++ *
++ * -- FEM, 04.xii.03
++ */
++extern unsigned int _mesa_sparc_glapi_begin;
++extern unsigned int _mesa_sparc_glapi_end;
++extern void __glapi_sparc_icache_flush(unsigned int *);
++static void _glx_mesa_init_sparc_glapi_relocs(void);
++static int _mesa_sparc_needs_init = 1;
++#define INIT_MESA_SPARC { \
++    if(_mesa_sparc_needs_init) { \
++      _glx_mesa_init_sparc_glapi_relocs(); \
++      _mesa_sparc_needs_init = 0; \
++  } \
++}
++#else
++#define INIT_MESA_SPARC
++#endif
++
+ /*
+ ** We setup some dummy structures here so that the API can be used
+ ** even if no context is current.
+@@ -489,6 +520,7 @@
+     }
+ #endif
+ 
++    INIT_MESA_SPARC
+     /* The one and only long long lock */
+     __glXLock();
+ 
+@@ -603,6 +635,7 @@
+ 
+ 	if (gc->currentDpy == dpy) {
+ 	    /* Use opcode from gc because its right */
++            INIT_MESA_SPARC
+ 	    return gc->majorOpcode;
+ 	} else {
+ 	    /*
+@@ -1029,3 +1062,64 @@
+     }	    
+ }
+ #endif
++
++/*
++ * Used only when we are sparc, using sparc assembler.
++ *
++ */
++
++static void
++_glx_mesa_init_sparc_glapi_relocs(void)
++{
++#ifdef  USE_SPARC_ASM
++	unsigned int *insn_ptr, *end_ptr;
++	unsigned long disp_addr;
++
++	insn_ptr = &_mesa_sparc_glapi_begin;
++	end_ptr = &_mesa_sparc_glapi_end;
++	disp_addr = (unsigned long) &_glapi_Dispatch;
++
++	/*
++	 * Verbatim from Mesa sparc.c.  It's needed because there doesn't
++	 * seem to be a better way to do this:
++	 *
++	 * UNCONDITIONAL_JUMP ( (*_glapi_Dispatch) + entry_offset )
++	 *
++	 * This code is patching in the ADDRESS of the pointer to the
++	 * dispatch table.  Hence, it must be called exactly once, because
++	 * that address is not going to change.
++	 *
++	 * What it points to can change, but Mesa (and hence, we) assume
++	 * that there is only one pointer.
++	 *
++	 */
++	while (insn_ptr < end_ptr) {
++# if ( defined(__sparc_v9__) && ( !defined(__linux__) || defined(__linux_64__) ) )
++/*
++	This code patches for 64-bit addresses.  This had better
++	not happen for Sparc/Linux, no matter what architecture we
++	are building for.  So, don't do this.
++
++	The 'defined(__linux_64__)' is used here as a placeholder for
++	when we do do 64-bit usermode on sparc linux.
++	*/
++		insn_ptr[0] |= (disp_addr >> (32 + 10));
++		insn_ptr[1] |= ((disp_addr & 0xffffffff) >> 10);
++		__glapi_sparc_icache_flush(&insn_ptr[0]);
++		insn_ptr[2] |= ((disp_addr >> 32) & ((1 << 10) - 1));
++		insn_ptr[3] |= (disp_addr & ((1 << 10) - 1));
++		__glapi_sparc_icache_flush(&insn_ptr[2]);
++		insn_ptr += 11;
++# else
++		insn_ptr[0] |= (disp_addr >> 10);
++		insn_ptr[1] |= (disp_addr & ((1 << 10) - 1));
++		__glapi_sparc_icache_flush(&insn_ptr[0]);
++		insn_ptr += 5;
++# endif
++#else
++		/*
++		 * Just no-op
++		 */
++#endif  /* sparc ASM in use */
++	}
++}


Property changes on: trunk/debian/patches/104_sparc_fix_GL_library.diff
___________________________________________________________________
Name: svn:keywords
   + Id



Reply to: