diff options
author | David S. Miller <davem@davemloft.net> | 2009-02-26 05:35:15 -0800 |
---|---|---|
committer | Brian Paul <brianp@vmware.com> | 2009-02-26 18:29:48 -0700 |
commit | 857ac1e817808f4b6bf985679162d0e3d709e5b5 (patch) | |
tree | d023570b1faaa91088d05111aaebe98e7c424d27 /src/mesa/sparc/sparc.c | |
parent | b12dc74f86c611483465c08504dc8a564f927b15 (diff) | |
download | external_mesa3d-857ac1e817808f4b6bf985679162d0e3d709e5b5.zip external_mesa3d-857ac1e817808f4b6bf985679162d0e3d709e5b5.tar.gz external_mesa3d-857ac1e817808f4b6bf985679162d0e3d709e5b5.tar.bz2 |
mesa: Resurrect SPARC asm code.
This rewrites the sparc GLAPI code so that it's PIC friendly and works
with all of the TLS/PTHREADS/64-bit/32-bit combinations properly.
As a result we can turn SPARC asm back on. Currently it's only
enabled on Linux, as that's the only place where I can test this
stuff out.
For the moment the cliptest SPARC asm routines are disabled as they
are non-working. The problem is that they use register %g7 as a
temporary which is where the threading libraries store the thread
pointer on SPARC. I will fix that code up in a future change as it's
a pretty important routine to optimize.
Like x86 we do the runtime patch as a pthread once-invoked initializer
in init_glapi_relocs().
Unlike x86, however, our GLAPI stubs on SPARC are just two instruction
sequences that branch to a trampoline and put the GLAPI offset into a
register. The trampoline is what we run-time patch. The stubs thus
all look like:
glFoo:
ba __glapi_sparc_foo_stub
sethi GLAPI_OFFSET(glFOO) * PTR_SIZE, %g3
This actually makes generate_entrypoint() a lot simpler on SPARC. For
this case in generate_entrypoint() we generate stubs using a 'call'
instead of the 'ba' above to make sure it can reach.
In order to get a proper tail call going here, in the unpatched case,
we do several tricks. To get the current PC, for example, we save the
return address register into a temporary, do a call, save the return
address register written by the call to another temporary, then
restore the original return address register value. This is to
avoid having to allocate a stack frame.
This is necessary for PIC address formation.
This new GLAPI scheme lets us get rid of the ugly SPARC GLAPI hacks in
__glXInitialize() and one_time_init().
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'src/mesa/sparc/sparc.c')
-rw-r--r-- | src/mesa/sparc/sparc.c | 38 |
1 files changed, 2 insertions, 36 deletions
diff --git a/src/mesa/sparc/sparc.c b/src/mesa/sparc/sparc.c index 84e8ac6..3bde98e 100644 --- a/src/mesa/sparc/sparc.c +++ b/src/mesa/sparc/sparc.c @@ -109,10 +109,10 @@ void _mesa_init_all_sparc_transform_asm(void) ASSIGN_XFORM_GROUP(sparc, 2) ASSIGN_XFORM_GROUP(sparc, 3) ASSIGN_XFORM_GROUP(sparc, 4) - +#if 0 _mesa_clip_tab[4] = _mesa_sparc_cliptest_points4; _mesa_clip_np_tab[4] = _mesa_sparc_cliptest_points4_np; - +#endif #if 0 /* disable these too. See bug 673938 */ _mesa_normal_tab[NORM_TRANSFORM | NORM_NORMALIZE] = @@ -140,38 +140,4 @@ void _mesa_init_all_sparc_transform_asm(void) #endif } -extern unsigned int _mesa_sparc_glapi_begin; -extern unsigned int _mesa_sparc_glapi_end; -extern void __glapi_sparc_icache_flush(unsigned int *); - -#endif /* USE_SPARC_ASM */ - - -void _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; - - while (insn_ptr < end_ptr) { -#ifdef __arch64__ - 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 - } #endif /* USE_SPARC_ASM */ -} |