Skip to content
  • David Miller's avatar
    mesa: Resurrect SPARC asm code. · 857ac1e8
    David Miller authored and Brian Paul's avatar Brian Paul committed
    
    
    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: default avatarDavid S. Miller <davem@davemloft.net>
    857ac1e8