[Dpcl-develop] ia64 'locking' routine update
Brought to you by:
dpcl-admin,
dwootton
|
From: Steve C. <sl...@cl...> - 2004-01-28 00:17:31
|
THe previous version that I sent out apparently wasn't quite right and the
new gcc 3.3.2 compile caught the problem. The following version (using named
operands ONLY - no numbered operands) seems to work well:
#define __atomic_fool_gcc(x) (*(volatile struct { int a[100]; } *)x)
int
_check_lock
(atomic_p addr, int old_val, int new_val)
{
long interim_val = 777;
int result = 0; /* default is success */
__asm__ __volatile__ ( "mf");
__asm__ __volatile__ (
"mov ar.ccv = %[old]"
:
: [old] "r"(old_val));
__asm__ __volatile__ (
"cmpxchg4.rel %[interim] =%[mem],%[new],ar.ccv"
: [interim] "=r" (interim_val)
: [mem] "m" (__atomic_fool_gcc(addr)), [new] "r" (new_val));
__asm__ __volatile__ ( "mf");
if( interim_val == old_val) {
/* lock memory value was old_val */
/* exchange to new_val done - new lock in place */
result = 0; /* false */
}
else {
/* lock memory value was NOT old_val */
result = 1; /* true */
}
return result;
}
I am now back to where I was with gcc 2.96 and, actually, a little further.
The following daemon log shows some real things happening, but of course
the 'attachProcess' does not work with the present IA64 Dyninst and things
eventually break. But for grins, here is the logfile:
ue Jan 27 14:08:22 2004: opened log /tmp/dpclsd.14530
@Timing started connect:14525
enter connect_cb: key(66) connect_stopped(0) pid(14525) client(0)
connect_cb(): create a new ProcessD for pid 14525
PModEntryInt (0x 25260)
enter ProcessD::connect()
cannot find the specified client socket 0, maybe it is a new one
popen found "/tmp/slc/hybrid_121503/dpcl/src/samples/hello/hello
"
bpatch attach: /tmp/slc/hybrid_121503/dpcl/src/samples/hello/hello 14525
enter prepare_new_process_shm()
enter locate_process_shm()
Dyninst-MD message: #0 (level 3): "Processing an executable file"
Dyninst-MD message: #0 (level 3): "Parsing object file: /proc/14525/exe"
Dyninst-MD message: #0 (level 3): "sorting modules"
Dyninst-MD message: #0 (level 3): "winnowing functions"
Dyninst-MD message: #0 (level 3): "defining modules"
Dyninst-MD message: #0 (level 3): "ready"
Dyninst-MD message: #0 (level 3): "PID=14525, initializing shared objects"
Dyninst-MD message: #0 (level 3): "parsing shared object files"
Dyninst-MD message: #0 (level 3): "Processing a shared object file"
Dyninst-MD message: #0 (level 3): "Parsing object file: /lib/libc.so.6.1"
Dyninst-MD message: #0 (level 3): "sorting modules"
Dyninst-MD message: #0 (level 3): "winnowing functions"
Tue Jan 27 14:08:23 2004: Dyninst-MD message: #0 (level 3): "defining modules"
Dyninst-MD message: #0 (level 3): "ready"
Dyninst-MD message: #0 (level 3): "Processing a shared object file"
Dyninst-MD message: #0 (level 3): "Parsing object file: /lib/ld-linux-ia64.so.2"
Dyninst-MD message: #0 (level 3): "sorting modules"
Dyninst-MD message: #0 (level 3): "winnowing functions"
Dyninst-MD message: #0 (level 3): "defining modules"
Dyninst-MD message: #0 (level 3): "ready"
Dyninst-MD message: #0 (level 3): "PID=14525, loading dyninst library"
Dyninst-MD message: #0 (level 2): "process 14525 has terminated on signal 11
"
Dyninst-MD message: #0 (level 3): "process 14525 has terminated on signal 11
"
Dyninst-MD message: #0 (level 2): " 0 total points used
"
Dyninst-MD message: #0 (level 2): " 0 mini-tramps used
"
Dyninst-MD message: #0 (level 2): " 0 tramp bytes
"
Dyninst-MD message: #0 (level 2): " 1 ptrace other calls
"
Dyninst-MD message: #0 (level 2): " 56 ptrace write calls
"
Dyninst-MD message: #0 (level 2): " 1630 ptrace bytes written
"
Dyninst-MD message: #0 (level 2): " 0 instructions generated
"
Dyninst-MD message: #0 (level 2): " 0.000000 time used to generate instrumentation
Thanks to DaveW/Albert/BillH for their copious help!!
SteveC
|