Port-sparc archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Berkeley db 4.8 and newer, and sparc
All,
the Berkeley db versions >= 4.8 do not build on sparc - see PR pkg/43444.
db v4.8 did away with fcntl locking , see
<http://forums.oracle.com/forums/thread.jspa?messageID=8398331>. Since
NetBSD lacks pthread_rwlock_*() support, we cannot configure
--with-mutex=POSIX/pthreads. And the db code ships with SPARC v9 exclusive
mutex assembler code.
Autoconf tries to explore (db-4.8.30/dist/configure) locking capabilities
with the SPARC v9 only
#if defined(__sparc__) && defined(__GNUC__)
asm volatile ("membar =
#StoreStore|#StoreLoad|#LoadStore");
exit(0);
#else
FAIL TO COMPILE/LINK
#endif
and the sparc mutex code in db-4.8.30/dbinc/mutex_int.h has:
<snip>
#ifdef HAVE_MUTEX_SPARC_GCC_ASSEMBLY
typedef unsigned char tsl_t;
#define MUTEX_ALIGN 8
#ifdef LOAD_ACTUAL_MUTEX_CODE
/*
* The ldstub instruction takes the location specified by its first argument
* (a register containing a memory address) and loads its contents into its
* second argument (a register) and atomically sets the contents the location
* specified by its first argument to a byte of 1s. (The value in the second
* argument is never read, but only overwritten.)
*
* Hybrid mutexes require membar #StoreLoad and #LoadStore ordering on multi-
* processor v9 systems.
*
* gcc/sparc: 0 is clear, 1 is set.
*/
#define MUTEX_SET(tsl) ({ \
register tsl_t *__l = (tsl); \
register tsl_t __r; \
__asm__ volatile \
("ldstub [%1],%0; stbar" \
: "=r"( __r) : "r" (__l)); \
!__r; \
})
#define MUTEX_UNSET(tsl) (*(tsl) = 0, MUTEX_MEMBAR(tsl))
#define MUTEX_INIT(tsl) (MUTEX_UNSET(tsl), 0)
#define MUTEX_MEMBAR(x) \
({ __asm__ volatile ("membar #StoreStore|#StoreLoad|#LoadStore"); })
#define MEMBAR_ENTER() \
({ __asm__ volatile ("membar #StoreStore|#StoreLoad"); })
#define MEMBAR_EXIT() \
({ __asm__ volatile ("membar #StoreStore|#LoadStore"); })
#endif
#endif
</snip>
Now, unfortunately, I couldn't SPARC assembler code my way out of the
proverbial paper bag. My questions:
o What is the equivalent of the above assembler code for SPARC v7?
o How does that equivalent work with v8 and v9 (sparc32 mode) cpus? With MP
machines?
o Or do we have to build specifically for the target cpu?
o Do we have any #defines besides __sparc__ and __sparc64__ to tell us
which cpu gcc creates code for?
o Is there a completely different way that I cannot see?
Thanks for reading this far,
hauke
--
The ASCII Ribbon Campaign Hauke Fath
() No HTML/RTF in email Institut für Nachrichtentechnik
/\ No Word docs in email TU Darmstadt
Respect for open standards Ruf +49-6151-16-3281
Home |
Main Index |
Thread Index |
Old Index