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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> 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