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: