MIPS deadlock bug fix
Edouard G. Parmelan
Edouard.Parmelan at quadratec.fr
Wed Jan 10 04:04:47 PST 2001
Slegers, Walter wrote:
> I known my MIPS manual by hart. Unfortunately, an original R3000
> processor core has no instructions to provide an atomic exchange or
> an atomic compare and exchange. I there were, I definitely would have
> used that as that seemed to be the proper action. Maybe an R4000
> (which has a store conditional instruction) might be able to do this,
> but on an R3000 you are really out of luck. If I hadn't used the
> "jthread_suspendall" call then I would have to switch to kernel mode
> to disable interrupts....
Could you review my COMPARE_AND_EXCHANGE for MIPS II before I commit it,
I'm learning MIPS assembly :-)
/*
* Do an atomic compare and exchange. The address 'A' is checked against
* value 'O' and if they match it's exchanged with value 'N'.
* We return '1' if the exchange is sucessful, otherwise 0.
*/
/* Note that this version use MIPS II ll/sc instructions */
#define COMPARE_AND_EXCHANGE(A,O,N) \
({ \
unsigned int tmp, ret; \
\
asm volatile( \
" .set noreorder\n" \
" .set mips2\n" \
" li %1, 0\n" \
"1: ll %0, %3\n" \
" bne %0, %4, 2f\n" \
" move %0, %5\n" \
" sc %0, %2\n" \
" beqz %0, 1b\n" \
" li %1, 1\n" \
"2: .set mips0\n" \
" .set reorder\n" \
: "=&r" (tmp), "=r" (ret), "=m" (*(A)) \
: "m" (*(A)), "r" (O), "r" (N) \
: "memory"); \
ret; \
})
--
Edouard G. Parmelan
http://egp.free.fr
More information about the kaffe
mailing list