On Mon, Mar 03, 2003 at 07:21:37PM +0900, Yoichi Yuasa wrote: > I found a bug in simulate_ll and simulate_sc. > The board that uses ll/sc emulation is not started. > > When send_sig in these, in order not to operate the value of EPC correctly, > simulate_* happens continuously. > > The previous patches were not perfect, I changed more. > Please apply these patches to CVS tree. As previously mentioned there were some problems with your fix, so I wrote an alternative fix which is attached below. It's untested because I don't have any ll/sc-less test platform. Ralf Index: arch/mips/kernel/traps.c =================================================================== RCS file: /home/cvs/linux/arch/mips/kernel/traps.c,v retrieving revision 1.99.2.41 diff -u -r1.99.2.41 traps.c --- arch/mips/kernel/traps.c 10 Feb 2003 22:50:48 -0000 1.99.2.41 +++ arch/mips/kernel/traps.c 4 Mar 2003 20:32:10 -0000 @@ -134,13 +134,14 @@ ll_bit = 0; } ll_task = current; + regs->regs[(opcode & RT) >> 16] = value; compute_return_epc(regs); return; sig: - send_sig(signal, current, 1); + force_sig(signal, current); } static inline void simulate_sc(struct pt_regs *regs, unsigned int opcode) @@ -172,19 +173,21 @@ } if (ll_bit == 0 || ll_task != current) { regs->regs[reg] = 0; - goto sig; + return; } - if (put_user(regs->regs[reg], vaddr)) + if (put_user(regs->regs[reg], vaddr)) { signal = SIGSEGV; - else - regs->regs[reg] = 1; + goto sig; + } + + regs->regs[reg] = 1; compute_return_epc(regs); return; sig: - send_sig(signal, current, 1); + force_sig(signal, current); } /*