Re: jmp 1b, how does this exit?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> > >From linux-2.6.16/include/asm-i386/semaphore.h (
> > http://lxr.linux.no/ident?v=2.6.10;i=down )
> > 105   static inline void down(struct semaphore * sem)
> > 106  {
> >    might_sleep();
> >    __asm__ __volatile__(
> >        "# atomic down operation\n\t"
> >        LOCK "decl %0\n\t"     /* --sem->count */ // locked and
> > decremented. "js 2f\n" // if sign is set jump to 2:
> >        "1:\n"
> >        LOCK_SECTION_START("") // starts a new section in elf, what
> > does this mean?
> >        "2:\tlea %0,%%eax\n\t" // loads &sem (==&sem->count) into eax.
> >        "call __down_failed\n\t" // this eventually returns when sem
> > is acquired 116        "jmp 1b\n" // goes back to 1: ... how would
> > this function ever return?
> > 117         LOCK_SECTION_END
> >        :"=m" (sem->count)
> >        :
> >        :"memory","ax");
> > }
>
>
> Ok, this is quite subtle. The explanation is in the
> LOCK_SECTION_START() and LOCK_SECTION_END() macros. These macros puts
> the code in-between in another section, far away from the current. So,
> in fact, after the 1:, what you have in memory, is not the "lea", but
> the next instruction after the down().
>
> So, if you write some C code like :
>
>  a = 2;
>  down ();
>  c = 1;
>
> It will end up like this :
>
>  - some assembly code to set a to 2
>  - LOCK decl %0
>  - js 2f /* Jump only in the contended case */
>  - some assembly code to set c to 1
Thank you very much. I was going back and forth in the info page of
as, but could not get a clearer picture. I understood there is
something like .subsection which would alter the text sequence, but
could not put things together in place. Now things are pretty clear.
And thanks again.

Regards,
Om.

Regards,
Om.

--
Kernelnewbies: Help each other learn about the Linux kernel.
Archive:       http://mail.nl.linux.org/kernelnewbies/
FAQ:           http://kernelnewbies.org/faq/



[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux