Subject: Re: [patch 08/18] PS3: Kexec support

From: Geoff Levand <[email-masked]>
Date: Sat, 09 Jun 2007 17:13:19 -0700

Benjamin Herrenschmidt wrote:
> On Thu, 2007-06-07 at 12:31 +1000, Michael Ellerman wrote:
>> > >> +  pr_debug("%s:%d: cpu %u, virq %d\n", __func__, __LINE__,
>> pd->cpu, virq);
>> > >> +
>> > >> +  local_irq_save(flags);
>> > >> +  asm volatile(
>> > >> +               "1:        ldarx %0,0,%3\n"
>> > >> +               "andc      %0,%0,%2\n"
>> > >> +               "stdcx.    %0,0,%3\n"
>> > >> +               "bne-      1b"
>> > >> +               : "=&r" (old), "+m" (*p)
>> > >> +               : "r" (bit), "r" (p)
>> > >> +               : "cc" );
>> > >> +
>> > >> +  lv1_did_update_interrupt_mask(pd->node, pd->cpu);
>> > >> +  local_irq_restore(flags);
>> > > 
>> > > How is this different from set_bit() ?  (asm-powerpc/bitops.h)
>> > > 
>> > > ps. now that I see you're just moving this code around someone's
>> > > probably already asked that question. 
> 
> Actually the above is clear_bit :-)
> 
> That would thus be something around the lines of:
> 
>  clear_bit(&pd->bmp.mask, 63 - virq);
> 
> Geoff, feel free to replace it with the clear_bit if you think it's
> nicer that way :-) (and double check I didn't smoke crack when doing
> the above conversion).
> 
> The other one in unmask would be set_bit() of course.

Almost right.  Needed clear_bit(63 - virq, &pd->bmp.mask).
I added it in.

-Geoff