Hi Ralf, On Tue, 4 Mar 2003 21:36:05 +0100 Ralf Baechle <ralf@linux-mips.org> wrote: > 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. I tested ll/sc simulate. Furthermore, the following patch is also needed. Thanks, Yoichi diff -aruN --exclude=CVS --exclude=.cvsignore linux.orig/arch/mips/kernel/traps.c linux/arch/mips/kernel/traps.c --- linux.orig/arch/mips/kernel/traps.c Wed Mar 5 12:05:00 2003 +++ linux/arch/mips/kernel/traps.c Thu Mar 6 16:37:40 2003 @@ -173,6 +173,7 @@ } if (ll_bit == 0 || ll_task != current) { regs->regs[reg] = 0; + compute_return_epc(regs); return; } > > 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); > } > > /* > > -- Yoichi Yuasa Montavista Software Japan, Inc. e-mail: yoichi_yuasa@montavista.co.jp http://www.montavista.co.jp PHONE: 03-5469-8840 FAX: 03-5469-8841