2008-01-02 11:45:50

by Abdel

[permalink] [raw]
Subject: macro _set_base - "do - while(0)" question

Hi,

In file include/asm-i386/system.h, _set_base and _set_limit use an
useless do ... while(0)

Why is this needed ?

exemple with _set_base from linux-2.6.23

#define _set_base(addr,base) do { unsigned long __pr; \
__asm__ __volatile__ ("movw %%dx,%1\n\t" \
"rorl $16,%%edx\n\t" \
"movb %%dl,%2\n\t" \
"movb %%dh,%3" \
:"=&d" (__pr) \
:"m" (*((addr)+2)), \
"m" (*((addr)+4)), \
"m" (*((addr)+7)), \
"0" (base) \
); } while(0)


--
Abdel
http://draconux.free.fr/


2008-01-02 11:50:05

by Sam Ravnborg

[permalink] [raw]
Subject: Re: macro _set_base - "do - while(0)" question

On Wed, Jan 02, 2008 at 12:45:39PM +0100, Abdel wrote:
> Hi,
>
> In file include/asm-i386/system.h, _set_base and _set_limit use an
> useless do ... while(0)
>
> Why is this needed ?
>
> exemple with _set_base from linux-2.6.23
>
> #define _set_base(addr,base) do { unsigned long __pr; \
> __asm__ __volatile__ ("movw %%dx,%1\n\t" \
> "rorl $16,%%edx\n\t" \
> "movb %%dl,%2\n\t" \
> "movb %%dh,%3" \
> :"=&d" (__pr) \
> :"m" (*((addr)+2)), \
> "m" (*((addr)+4)), \
> "m" (*((addr)+7)), \
> "0" (base) \
> ); } while(0)
>
Without the do {} while (0)

then
1) you could not define the variable __pr
2) You would be fooled when you did:

if (foo != bar)
set_base(addr,base);


Sam

2008-01-02 12:15:54

by Bodo Eggert

[permalink] [raw]
Subject: Re: macro _set_base - "do - while(0)" question

Abdel <[email protected]> wrote:

> In file include/asm-i386/system.h, _set_base and _set_limit use an
> useless do ... while(0)
>
> Why is this needed ?

http://kernelnewbies.org/FAQ/DoWhile0

2008-01-02 13:01:16

by DervishD

[permalink] [raw]
Subject: Re: macro _set_base - "do - while(0)" question

Hi Abdel :)

* Abdel <[email protected]> dixit:
> In file include/asm-i386/system.h, _set_base and _set_limit use an
> useless do ... while(0)
>
> Why is this needed ?

Google for "do while swallow semicolon". This looks like an useless and
weird construction but it is very useful when it comes to macros (you
can define variables inside the block and you can use your macro as any
other statement, it won't swallow the semicolon).

Raúl Núñez de Arenas Coronado
--
Linux Registered User 88736 | http://www.dervishd.net
It's my PC and I'll cry if I want to... RAmen!
We are waiting for 13 Feb 2009 23:31:30 +0000 ...

2008-01-02 13:22:21

by Abdel

[permalink] [raw]
Subject: Re: macro _set_base - "do - while(0)" question

2008/1/2, DervishD <[email protected]>:

> * Abdel <[email protected]> dixit:
> > In file include/asm-i386/system.h, _set_base and _set_limit use an
> > useless do ... while(0)
> >
> > Why is this needed ?
>
> Google for "do while swallow semicolon". This looks like an useless and
> weird construction but it is very useful when it comes to macros (you
> can define variables inside the block and you can use your macro as any
> other statement, it won't swallow the semicolon).


thanks to all for your responses :)

--
Abdel
http://draconux.free.fr/