[coreboot] [PATCH]More consistent behaviour for printk_*

Carl-Daniel Hailfinger c-d.hailfinger.devel.2006 at gmx.net
Mon Apr 27 20:35:30 CEST 2009


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 <patrick.georgi at coresystems.de>
>   


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 <c-d.hailfinger.devel.2006 at gmx.net>

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/

-------------- next part --------------
A non-text attachment was scrubbed...
Name: linuxbios_printk_level_side_effects.diff
Type: text/x-patch
Size: 2065 bytes
Desc: not available
URL: <http://www.coreboot.org/pipermail/coreboot/attachments/20090427/f070440a/attachment.diff>


More information about the coreboot mailing list