On 27.04.2009 19:48, Patrick Georgi wrote:
> Hi,
>
> the attached patch make printk_* behaviour more consistent. Without it, side 
> effects in the arguments (eg. a pci config read, or variable increment) 
> "vanish" with the message, and the behaviour changes.
>   

Ouch. Great find!

> Example:
> printk_info("foo %d\n", i++);
>
> Without this patch, this becomes (for suitable loglevels)
> do {} while (0)
>
> With this patch, this will be:
> do_printk(EMERG, "", i++);
>
> Some of these effects might be unwanted, but at least they are consistent 
> now. 
> For example, via c7 CAR failed for loglevel > 7 for various reasons (patch 
> upcoming). While it fails all the time now (this patch is no "magic fix"), 
> upcoming development is less likely to produce such "hidden surprises".
>
> To reduce the memory footprint slightly, the formatted strings are discarded. 
> A simpler patch would be to just kill the whole "#if #undef #define #endif"-
> section, but then a lot of strings that never surface would be compiled in 
> (and I doubt the compiler is clever enough to figure that out)
>
> Signed-off-by: Patrick Georgi <[email protected]>
>   


Let me propose an alternative which does not have an empty printk call,
yet keeps the side effects of all parameters.

Signed-off-by: Carl-Daniel Hailfinger <[email protected]>

Index: LinuxBIOSv2-printk_level_side_effects/src/arch/i386/lib/console_printk.c
===================================================================
--- LinuxBIOSv2-printk_level_side_effects/src/arch/i386/lib/console_printk.c    
(Revision 4217)
+++ LinuxBIOSv2-printk_level_side_effects/src/arch/i386/lib/console_printk.c    
(Arbeitskopie)
@@ -13,39 +13,39 @@
 
 #if MAXIMUM_CONSOLE_LOGLEVEL <= BIOS_EMERG
 #undef  printk_emerg
-#define printk_emerg(fmt, arg...)   do {} while(0)
+#define printk_emerg(fmt, arg...)   do { arg; } while(0)
 #endif
 #if MAXIMUM_CONSOLE_LOGLEVEL <= BIOS_ALERT
 #undef  printk_alert
-#define printk_alert(fmt, arg...)   do {} while(0)
+#define printk_alert(fmt, arg...)   do { arg; } while(0)
 #endif
 #if MAXIMUM_CONSOLE_LOGLEVEL <= BIOS_CRIT
 #undef  printk_crit
-#define printk_crit(fmt, arg...)    do {} while(0)
+#define printk_crit(fmt, arg...)    do { arg; } while(0)
 #endif
 #if MAXIMUM_CONSOLE_LOGLEVEL <= BIOS_ERR
 #undef  printk_err
-#define printk_err(fmt, arg...)     do {} while(0)
+#define printk_err(fmt, arg...)     do { arg; } while(0)
 #endif
 #if MAXIMUM_CONSOLE_LOGLEVEL <= BIOS_WARNING
 #undef  printk_warning
-#define printk_warning(fmt, arg...) do {} while(0)
+#define printk_warning(fmt, arg...) do { arg; } while(0)
 #endif
 #if MAXIMUM_CONSOLE_LOGLEVEL <= BIOS_NOTICE
 #undef  printk_notice
-#define printk_notice(fmt, arg...)  do {} while(0)
+#define printk_notice(fmt, arg...)  do { arg; } while(0)
 #endif
 #if MAXIMUM_CONSOLE_LOGLEVEL <= BIOS_INFO
 #undef  printk_info
-#define printk_info(fmt, arg...)    do {} while(0)
+#define printk_info(fmt, arg...)    do { arg; } while(0)
 #endif
 #if MAXIMUM_CONSOLE_LOGLEVEL <= BIOS_DEBUG
 #undef  printk_debug
-#define printk_debug(fmt, arg...)   do {} while(0)
+#define printk_debug(fmt, arg...)   do { arg; } while(0)
 #endif
 #if MAXIMUM_CONSOLE_LOGLEVEL <= BIOS_SPEW
 #undef  printk_spew
-#define printk_spew(fmt, arg...)    do {} while(0)
+#define printk_spew(fmt, arg...)    do { arg; } while(0)
 #endif
 
 #define print_emerg(STR)   printk_emerg  ("%s", (STR))


-- 
http://www.hailfinger.org/

Index: LinuxBIOSv2-printk_level_side_effects/src/arch/i386/lib/console_printk.c
===================================================================
--- LinuxBIOSv2-printk_level_side_effects/src/arch/i386/lib/console_printk.c	(Revision 4217)
+++ LinuxBIOSv2-printk_level_side_effects/src/arch/i386/lib/console_printk.c	(Arbeitskopie)
@@ -13,39 +13,39 @@
 
 #if MAXIMUM_CONSOLE_LOGLEVEL <= BIOS_EMERG
 #undef  printk_emerg
-#define printk_emerg(fmt, arg...)   do {} while(0)
+#define printk_emerg(fmt, arg...)   do { arg; } while(0)
 #endif
 #if MAXIMUM_CONSOLE_LOGLEVEL <= BIOS_ALERT
 #undef  printk_alert
-#define printk_alert(fmt, arg...)   do {} while(0)
+#define printk_alert(fmt, arg...)   do { arg; } while(0)
 #endif
 #if MAXIMUM_CONSOLE_LOGLEVEL <= BIOS_CRIT
 #undef  printk_crit
-#define printk_crit(fmt, arg...)    do {} while(0)
+#define printk_crit(fmt, arg...)    do { arg; } while(0)
 #endif
 #if MAXIMUM_CONSOLE_LOGLEVEL <= BIOS_ERR
 #undef  printk_err
-#define printk_err(fmt, arg...)     do {} while(0)
+#define printk_err(fmt, arg...)     do { arg; } while(0)
 #endif
 #if MAXIMUM_CONSOLE_LOGLEVEL <= BIOS_WARNING
 #undef  printk_warning
-#define printk_warning(fmt, arg...) do {} while(0)
+#define printk_warning(fmt, arg...) do { arg; } while(0)
 #endif
 #if MAXIMUM_CONSOLE_LOGLEVEL <= BIOS_NOTICE
 #undef  printk_notice
-#define printk_notice(fmt, arg...)  do {} while(0)
+#define printk_notice(fmt, arg...)  do { arg; } while(0)
 #endif
 #if MAXIMUM_CONSOLE_LOGLEVEL <= BIOS_INFO
 #undef  printk_info
-#define printk_info(fmt, arg...)    do {} while(0)
+#define printk_info(fmt, arg...)    do { arg; } while(0)
 #endif
 #if MAXIMUM_CONSOLE_LOGLEVEL <= BIOS_DEBUG
 #undef  printk_debug
-#define printk_debug(fmt, arg...)   do {} while(0)
+#define printk_debug(fmt, arg...)   do { arg; } while(0)
 #endif
 #if MAXIMUM_CONSOLE_LOGLEVEL <= BIOS_SPEW
 #undef  printk_spew
-#define printk_spew(fmt, arg...)    do {} while(0)
+#define printk_spew(fmt, arg...)    do { arg; } while(0)
 #endif
 
 #define print_emerg(STR)   printk_emerg  ("%s", (STR))
-- 
coreboot mailing list: [email protected]
http://www.coreboot.org/mailman/listinfo/coreboot

Reply via email to