f9d9182d64
inlining resulted in constant propagation to the extend that cmpval was known to the compiler to be URWLOCK_WRITE_OWNER (= 0x80000000U). Unfortunately, instead of zero-extending the unsigned constant, it was sign-extended. As such, the cmpxchg instruction was comparing 0x0000000080000000LU to 0xffffffff80000000LU and obviously didn't perform the exchange. But, since the value returned by cmpxhg equalled cmpval (when zero- extended), the _thr_rtld_lock_release() function thought the exchange did happen and as such returned as if having released the lock. This was not the case. Subsequent locking requests found rw_state non-zero and the thread in question entered the kernel and block indefinitely. The work-around is to zero-extend by casting to uint64_t. |
||
---|---|---|
.. | ||
pc | ||
_bus.h | ||
_inttypes.h | ||
_limits.h | ||
_regset.h | ||
_stdint.h | ||
_types.h | ||
acpica_machdep.h | ||
asm.h | ||
atomic.h | ||
bootinfo.h | ||
bus_dma.h | ||
bus.h | ||
clock.h | ||
cpu.h | ||
cpufunc.h | ||
db_machdep.h | ||
dig64.h | ||
efi.h | ||
elf.h | ||
endian.h | ||
exec.h | ||
float.h | ||
floatingpoint.h | ||
fpu.h | ||
frame.h | ||
gdb_machdep.h | ||
ia64_cpu.h | ||
ieee.h | ||
ieeefp.h | ||
in_cksum.h | ||
intr.h | ||
intrcnt.h | ||
kdb.h | ||
limits.h | ||
mca.h | ||
md_var.h | ||
memdev.h | ||
mutex.h | ||
nexusvar.h | ||
pal.h | ||
param.h | ||
pcb.h | ||
pci_cfgreg.h | ||
pcpu.h | ||
pmap.h | ||
pmc_mdep.h | ||
proc.h | ||
profile.h | ||
pte.h | ||
ptrace.h | ||
reg.h | ||
reloc.h | ||
resource.h | ||
runq.h | ||
sal.h | ||
sapicreg.h | ||
sapicvar.h | ||
setjmp.h | ||
sf_buf.h | ||
sigframe.h | ||
signal.h | ||
smp.h | ||
stdarg.h | ||
sysarch.h | ||
ucontext.h | ||
unwind.h | ||
varargs.h | ||
vmparam.h |