[LinuxBIOS] [RFC] Macros vs. functions for better readability

Juergen Beisert juergen127 at kreuzholzen.de
Sun Jan 6 22:43:54 CET 2008


On Sunday 06 January 2008 18:32, Carl-Daniel Hailfinger wrote:
> How do we factor out such code? I prefer macros for simple function
> wrappers and functions for multiline sequences.

As we are working with hardware we should avoid any macros for function 
replacement. There are ugly side effects. Refer the getCx86()/setCx86() 
disaster in the kernel for Geode-GX1 chipset programming:

What wrong with that?

#define getCx86(reg) ({ outb((reg), 0x22); inb(0x23); })
#define setCx86(reg, data) do { \
       outb((reg), 0x22); \
       outb((data), 0x23); \
} while (0)

This works:
  x = getCx86(0x20);
  x |= 0x01;
  setCx86(0x20, x);

This fails badly:
  setCx86(0x20, getCx86(0x20) | 0x01);

getCx86 and setCx86 defined as inline functions are working in all cases. So: 
Do not use macros as functions.

Juergen




More information about the coreboot mailing list