Ronald G. Minnich (rminnich(a)gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/3188
-gerrit
commit e093b075359576f1220daa7433525ddf6074a723
Author: Ronald G. Minnich <rminnich(a)gmail.com>
Date: Fri May 3 18:25:27 2013 +0200
Get rid of MAXIMUM_CONSOLE_LOGLEVEL; compile all messages into the coreboot binary.
This option has never had much if any use. It solved a problem over 10 years ago that resulted
from an argument over the value or lack thereof of including all the debug strings in a coreboot
image. The answer is in: it's a good idea to maintain the capabilty to print all messages,
for many reasons.
This option is also misleading people, as in a recent discussion, to believe that log messges
are controlled at build time in a way they are not. For the record, from this day forward,
we can print messages at all log levels and the default log level is set at boot time, as
directed by DEFAULT_CONSOLE_LOGLEVEL. You can set the default to 0 at build time
and if you are having trouble override it in CMOS and get more messages.
Besides, a quick glance shows it's always set to max (9 in this case) in the very few cases
(1) in which it is set.
Change-Id: I60c4cdaf4dcd318b841a6d6c70546417c5626f21
Signed-off-by: Ronald G. Minnich <rminnich(a)gmail.com>
---
documentation/LinuxBIOS-AMD64.tex | 5 ---
src/console/Kconfig | 79 ----------------------------------
src/include/console/console.h | 10 +----
src/mainboard/msi/ms9652_fam10/Kconfig | 4 --
util/abuild/abuild | 2 -
5 files changed, 2 insertions(+), 98 deletions(-)
diff --git a/documentation/LinuxBIOS-AMD64.tex b/documentation/LinuxBIOS-AMD64.tex
index 19a6f59..5847dab 100644
--- a/documentation/LinuxBIOS-AMD64.tex
+++ b/documentation/LinuxBIOS-AMD64.tex
@@ -408,11 +408,6 @@ machine.
Use new \textit{chip\_configure} method for configuring (nonpci)
devices. Set to \texttt{1} for all AMD64 mainboards.
-\item \begin{verbatim}CONFIG_MAXIMUM_CONSOLE_LOGLEVEL\end{verbatim}
-
-Errors or log messages up to this level can be printed. Default is
-\texttt{8}, minimum is \texttt{0}, maximum is \texttt{10}.
-
\item \begin{verbatim}CONFIG_DEFAULT_CONSOLE_LOGLEVEL\end{verbatim}
Console will log at this level unless changed. Default is \texttt{7},
diff --git a/src/console/Kconfig b/src/console/Kconfig
index 6251589..a613477 100644
--- a/src/console/Kconfig
+++ b/src/console/Kconfig
@@ -250,119 +250,40 @@ config CONSOLE_CAR_BUFFER_SIZE
in the DCACHE based RAM to keep console output before it can be
saved in a CBMEM buffer. 3K bytes should be enough even for the
BIOS_SPEW level.
-
-
-choice
- prompt "Maximum console log level"
- default MAXIMUM_CONSOLE_LOGLEVEL_8
-
-config MAXIMUM_CONSOLE_LOGLEVEL_8
- bool "8: SPEW"
- help
- Way too many details.
-config MAXIMUM_CONSOLE_LOGLEVEL_7
- bool "7: DEBUG"
- help
- Debug-level messages.
-config MAXIMUM_CONSOLE_LOGLEVEL_6
- bool "6: INFO"
- help
- Informational messages.
-config MAXIMUM_CONSOLE_LOGLEVEL_5
- bool "5: NOTICE"
- help
- Normal but significant conditions.
-config MAXIMUM_CONSOLE_LOGLEVEL_4
- bool "4: WARNING"
- help
- Warning conditions.
-config MAXIMUM_CONSOLE_LOGLEVEL_3
- bool "3: ERR"
- help
- Error conditions.
-config MAXIMUM_CONSOLE_LOGLEVEL_2
- bool "2: CRIT"
- help
- Critical conditions.
-config MAXIMUM_CONSOLE_LOGLEVEL_1
- bool "1: ALERT"
- help
- Action must be taken immediately.
-config MAXIMUM_CONSOLE_LOGLEVEL_0
- bool "0: EMERG"
- help
- System is unusable.
-
-endchoice
-
-config MAXIMUM_CONSOLE_LOGLEVEL
- int
- default 0 if MAXIMUM_CONSOLE_LOGLEVEL_0
- default 1 if MAXIMUM_CONSOLE_LOGLEVEL_1
- default 2 if MAXIMUM_CONSOLE_LOGLEVEL_2
- default 3 if MAXIMUM_CONSOLE_LOGLEVEL_3
- default 4 if MAXIMUM_CONSOLE_LOGLEVEL_4
- default 5 if MAXIMUM_CONSOLE_LOGLEVEL_5
- default 6 if MAXIMUM_CONSOLE_LOGLEVEL_6
- default 7 if MAXIMUM_CONSOLE_LOGLEVEL_7
- default 8 if MAXIMUM_CONSOLE_LOGLEVEL_8
- help
- Map the log level config names to an integer.
-
choice
prompt "Default console log level"
default DEFAULT_CONSOLE_LOGLEVEL_8
config DEFAULT_CONSOLE_LOGLEVEL_8
bool "8: SPEW"
- depends on (MAXIMUM_CONSOLE_LOGLEVEL_8)
help
Way too many details.
config DEFAULT_CONSOLE_LOGLEVEL_7
bool "7: DEBUG"
- depends on (MAXIMUM_CONSOLE_LOGLEVEL_8 || MAXIMUM_CONSOLE_LOGLEVEL_7)
help
Debug-level messages.
config DEFAULT_CONSOLE_LOGLEVEL_6
bool "6: INFO"
- depends on (MAXIMUM_CONSOLE_LOGLEVEL_8 || MAXIMUM_CONSOLE_LOGLEVEL_7 ||\
- MAXIMUM_CONSOLE_LOGLEVEL_6)
help
Informational messages.
config DEFAULT_CONSOLE_LOGLEVEL_5
bool "5: NOTICE"
- depends on (MAXIMUM_CONSOLE_LOGLEVEL_8 || MAXIMUM_CONSOLE_LOGLEVEL_7 ||\
- MAXIMUM_CONSOLE_LOGLEVEL_6 || MAXIMUM_CONSOLE_LOGLEVEL_5)
help
Normal but significant conditions.
config DEFAULT_CONSOLE_LOGLEVEL_4
bool "4: WARNING"
- depends on (MAXIMUM_CONSOLE_LOGLEVEL_8 || MAXIMUM_CONSOLE_LOGLEVEL_7 ||\
- MAXIMUM_CONSOLE_LOGLEVEL_6 || MAXIMUM_CONSOLE_LOGLEVEL_5 ||\
- MAXIMUM_CONSOLE_LOGLEVEL_4)
help
Warning conditions.
config DEFAULT_CONSOLE_LOGLEVEL_3
bool "3: ERR"
- depends on (MAXIMUM_CONSOLE_LOGLEVEL_8 || MAXIMUM_CONSOLE_LOGLEVEL_7 ||\
- MAXIMUM_CONSOLE_LOGLEVEL_6 || MAXIMUM_CONSOLE_LOGLEVEL_5 ||\
- MAXIMUM_CONSOLE_LOGLEVEL_4 || MAXIMUM_CONSOLE_LOGLEVEL_3)
help
Error conditions.
config DEFAULT_CONSOLE_LOGLEVEL_2
bool "2: CRIT"
- depends on (MAXIMUM_CONSOLE_LOGLEVEL_8 || MAXIMUM_CONSOLE_LOGLEVEL_7 ||\
- MAXIMUM_CONSOLE_LOGLEVEL_6 || MAXIMUM_CONSOLE_LOGLEVEL_5 ||\
- MAXIMUM_CONSOLE_LOGLEVEL_4 || MAXIMUM_CONSOLE_LOGLEVEL_3 ||\
- MAXIMUM_CONSOLE_LOGLEVEL_2)
help
Critical conditions.
config DEFAULT_CONSOLE_LOGLEVEL_1
bool "1: ALERT"
- depends on (MAXIMUM_CONSOLE_LOGLEVEL_8 || MAXIMUM_CONSOLE_LOGLEVEL_7 ||\
- MAXIMUM_CONSOLE_LOGLEVEL_6 || MAXIMUM_CONSOLE_LOGLEVEL_5 ||\
- MAXIMUM_CONSOLE_LOGLEVEL_4 || MAXIMUM_CONSOLE_LOGLEVEL_3 ||\
- MAXIMUM_CONSOLE_LOGLEVEL_2 || MAXIMUM_CONSOLE_LOGLEVEL_1)
help
Action must be taken immediately.
config DEFAULT_CONSOLE_LOGLEVEL_0
diff --git a/src/include/console/console.h b/src/include/console/console.h
index d320093..031c25d 100644
--- a/src/include/console/console.h
+++ b/src/include/console/console.h
@@ -104,20 +104,14 @@ static inline void printk(int LEVEL, const char *fmt, ...) {
#define printk(LEVEL, fmt, args...) \
do { \
- if (CONFIG_MAXIMUM_CONSOLE_LOGLEVEL >= LEVEL) { \
- do_printk(LEVEL, fmt, ##args); \
- } \
+ do_printk(LEVEL, fmt, ##args); \
} while(0)
#else
#define printk(LEVEL, fmt, args...) \
do { \
- if (CONFIG_MAXIMUM_CONSOLE_LOGLEVEL >= LEVEL) { \
- do_printk(LEVEL, fmt, ##args); \
- } else { \
- do_printk(BIOS_NEVER, fmt, ##args); \
- } \
+ do_printk(LEVEL, fmt, ##args); \
} while(0)
#endif
diff --git a/src/mainboard/msi/ms9652_fam10/Kconfig b/src/mainboard/msi/ms9652_fam10/Kconfig
index 852efd4..58cafa2 100644
--- a/src/mainboard/msi/ms9652_fam10/Kconfig
+++ b/src/mainboard/msi/ms9652_fam10/Kconfig
@@ -97,10 +97,6 @@ config DEFAULT_CONSOLE_LOGLEVEL
int
default 9
-config MAXIMUM_CONSOLE_LOGLEVEL
- int
- default 9
-
config MAINBOARD_POWER_ON_AFTER_POWER_FAIL
bool
default y
diff --git a/util/abuild/abuild b/util/abuild/abuild
index 1c69eec..aad066c 100755
--- a/util/abuild/abuild
+++ b/util/abuild/abuild
@@ -596,8 +596,6 @@ while true ; do
-C|--config) shift; configureonly=1;;
-l|--loglevel) shift
customizing="${customizing}, loglevel $1"
- configoptions="${configoptions}CONFIG_MAXIMUM_CONSOLE_LOGLEVEL_$1=y\n"
- configoptions="${configoptions}CONFIG_MAXIMUM_CONSOLE_LOGLEVEL=$1\n"
configoptions="${configoptions}CONFIG_DEFAULT_CONSOLE_LOGLEVEL_$1=y\n"
configoptions="${configoptions}CONFIG_DEFAULT_CONSOLE_LOGLEVEL=$1\n"
shift;;
Ronald G. Minnich (rminnich(a)gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/3188
-gerrit
commit 8cac2c5658930441158638db1f7d692f82201fe3
Author: Ronald G. Minnich <rminnich(a)gmail.com>
Date: Fri May 3 18:25:27 2013 +0200
Get rid of MAXIMUM_CONSOLE_LOGLEVEL; compile all messages into the coreboot binary.
This option has never had much if any use. It solved a problem over 10 years ago that resulted
from an argument over the value or lack thereof of including all the debug strings in a coreboot
image. The answer is in: it's a good idea to maintain the capabilty of print all messages,
for many reasons.
It's also misleading people, as in a recent discussion, to believe that log messges
are controlled at build time in a way they are not. For the record, from this day forward,
we can print messages at all log levels and the maximum log level is set at boot time, as
directed by DEFAULT_CONSOLE_LOGLEVEL. You can set the default to 0 and if you are having
trouble override it in CMOS and get more messages..
Besides, a quick glance shows it's always set to max (9 in this case) in the very few cases
(1) in which it is set.
Change-Id: I60c4cdaf4dcd318b841a6d6c70546417c5626f21
Signed-off-by: Ronald G. Minnich <rminnich(a)gmail.com>
---
documentation/LinuxBIOS-AMD64.tex | 5 ---
src/console/Kconfig | 79 ----------------------------------
src/include/console/console.h | 10 +----
src/mainboard/msi/ms9652_fam10/Kconfig | 4 --
util/abuild/abuild | 2 -
5 files changed, 2 insertions(+), 98 deletions(-)
diff --git a/documentation/LinuxBIOS-AMD64.tex b/documentation/LinuxBIOS-AMD64.tex
index 19a6f59..5847dab 100644
--- a/documentation/LinuxBIOS-AMD64.tex
+++ b/documentation/LinuxBIOS-AMD64.tex
@@ -408,11 +408,6 @@ machine.
Use new \textit{chip\_configure} method for configuring (nonpci)
devices. Set to \texttt{1} for all AMD64 mainboards.
-\item \begin{verbatim}CONFIG_MAXIMUM_CONSOLE_LOGLEVEL\end{verbatim}
-
-Errors or log messages up to this level can be printed. Default is
-\texttt{8}, minimum is \texttt{0}, maximum is \texttt{10}.
-
\item \begin{verbatim}CONFIG_DEFAULT_CONSOLE_LOGLEVEL\end{verbatim}
Console will log at this level unless changed. Default is \texttt{7},
diff --git a/src/console/Kconfig b/src/console/Kconfig
index 6251589..a613477 100644
--- a/src/console/Kconfig
+++ b/src/console/Kconfig
@@ -250,119 +250,40 @@ config CONSOLE_CAR_BUFFER_SIZE
in the DCACHE based RAM to keep console output before it can be
saved in a CBMEM buffer. 3K bytes should be enough even for the
BIOS_SPEW level.
-
-
-choice
- prompt "Maximum console log level"
- default MAXIMUM_CONSOLE_LOGLEVEL_8
-
-config MAXIMUM_CONSOLE_LOGLEVEL_8
- bool "8: SPEW"
- help
- Way too many details.
-config MAXIMUM_CONSOLE_LOGLEVEL_7
- bool "7: DEBUG"
- help
- Debug-level messages.
-config MAXIMUM_CONSOLE_LOGLEVEL_6
- bool "6: INFO"
- help
- Informational messages.
-config MAXIMUM_CONSOLE_LOGLEVEL_5
- bool "5: NOTICE"
- help
- Normal but significant conditions.
-config MAXIMUM_CONSOLE_LOGLEVEL_4
- bool "4: WARNING"
- help
- Warning conditions.
-config MAXIMUM_CONSOLE_LOGLEVEL_3
- bool "3: ERR"
- help
- Error conditions.
-config MAXIMUM_CONSOLE_LOGLEVEL_2
- bool "2: CRIT"
- help
- Critical conditions.
-config MAXIMUM_CONSOLE_LOGLEVEL_1
- bool "1: ALERT"
- help
- Action must be taken immediately.
-config MAXIMUM_CONSOLE_LOGLEVEL_0
- bool "0: EMERG"
- help
- System is unusable.
-
-endchoice
-
-config MAXIMUM_CONSOLE_LOGLEVEL
- int
- default 0 if MAXIMUM_CONSOLE_LOGLEVEL_0
- default 1 if MAXIMUM_CONSOLE_LOGLEVEL_1
- default 2 if MAXIMUM_CONSOLE_LOGLEVEL_2
- default 3 if MAXIMUM_CONSOLE_LOGLEVEL_3
- default 4 if MAXIMUM_CONSOLE_LOGLEVEL_4
- default 5 if MAXIMUM_CONSOLE_LOGLEVEL_5
- default 6 if MAXIMUM_CONSOLE_LOGLEVEL_6
- default 7 if MAXIMUM_CONSOLE_LOGLEVEL_7
- default 8 if MAXIMUM_CONSOLE_LOGLEVEL_8
- help
- Map the log level config names to an integer.
-
choice
prompt "Default console log level"
default DEFAULT_CONSOLE_LOGLEVEL_8
config DEFAULT_CONSOLE_LOGLEVEL_8
bool "8: SPEW"
- depends on (MAXIMUM_CONSOLE_LOGLEVEL_8)
help
Way too many details.
config DEFAULT_CONSOLE_LOGLEVEL_7
bool "7: DEBUG"
- depends on (MAXIMUM_CONSOLE_LOGLEVEL_8 || MAXIMUM_CONSOLE_LOGLEVEL_7)
help
Debug-level messages.
config DEFAULT_CONSOLE_LOGLEVEL_6
bool "6: INFO"
- depends on (MAXIMUM_CONSOLE_LOGLEVEL_8 || MAXIMUM_CONSOLE_LOGLEVEL_7 ||\
- MAXIMUM_CONSOLE_LOGLEVEL_6)
help
Informational messages.
config DEFAULT_CONSOLE_LOGLEVEL_5
bool "5: NOTICE"
- depends on (MAXIMUM_CONSOLE_LOGLEVEL_8 || MAXIMUM_CONSOLE_LOGLEVEL_7 ||\
- MAXIMUM_CONSOLE_LOGLEVEL_6 || MAXIMUM_CONSOLE_LOGLEVEL_5)
help
Normal but significant conditions.
config DEFAULT_CONSOLE_LOGLEVEL_4
bool "4: WARNING"
- depends on (MAXIMUM_CONSOLE_LOGLEVEL_8 || MAXIMUM_CONSOLE_LOGLEVEL_7 ||\
- MAXIMUM_CONSOLE_LOGLEVEL_6 || MAXIMUM_CONSOLE_LOGLEVEL_5 ||\
- MAXIMUM_CONSOLE_LOGLEVEL_4)
help
Warning conditions.
config DEFAULT_CONSOLE_LOGLEVEL_3
bool "3: ERR"
- depends on (MAXIMUM_CONSOLE_LOGLEVEL_8 || MAXIMUM_CONSOLE_LOGLEVEL_7 ||\
- MAXIMUM_CONSOLE_LOGLEVEL_6 || MAXIMUM_CONSOLE_LOGLEVEL_5 ||\
- MAXIMUM_CONSOLE_LOGLEVEL_4 || MAXIMUM_CONSOLE_LOGLEVEL_3)
help
Error conditions.
config DEFAULT_CONSOLE_LOGLEVEL_2
bool "2: CRIT"
- depends on (MAXIMUM_CONSOLE_LOGLEVEL_8 || MAXIMUM_CONSOLE_LOGLEVEL_7 ||\
- MAXIMUM_CONSOLE_LOGLEVEL_6 || MAXIMUM_CONSOLE_LOGLEVEL_5 ||\
- MAXIMUM_CONSOLE_LOGLEVEL_4 || MAXIMUM_CONSOLE_LOGLEVEL_3 ||\
- MAXIMUM_CONSOLE_LOGLEVEL_2)
help
Critical conditions.
config DEFAULT_CONSOLE_LOGLEVEL_1
bool "1: ALERT"
- depends on (MAXIMUM_CONSOLE_LOGLEVEL_8 || MAXIMUM_CONSOLE_LOGLEVEL_7 ||\
- MAXIMUM_CONSOLE_LOGLEVEL_6 || MAXIMUM_CONSOLE_LOGLEVEL_5 ||\
- MAXIMUM_CONSOLE_LOGLEVEL_4 || MAXIMUM_CONSOLE_LOGLEVEL_3 ||\
- MAXIMUM_CONSOLE_LOGLEVEL_2 || MAXIMUM_CONSOLE_LOGLEVEL_1)
help
Action must be taken immediately.
config DEFAULT_CONSOLE_LOGLEVEL_0
diff --git a/src/include/console/console.h b/src/include/console/console.h
index d320093..031c25d 100644
--- a/src/include/console/console.h
+++ b/src/include/console/console.h
@@ -104,20 +104,14 @@ static inline void printk(int LEVEL, const char *fmt, ...) {
#define printk(LEVEL, fmt, args...) \
do { \
- if (CONFIG_MAXIMUM_CONSOLE_LOGLEVEL >= LEVEL) { \
- do_printk(LEVEL, fmt, ##args); \
- } \
+ do_printk(LEVEL, fmt, ##args); \
} while(0)
#else
#define printk(LEVEL, fmt, args...) \
do { \
- if (CONFIG_MAXIMUM_CONSOLE_LOGLEVEL >= LEVEL) { \
- do_printk(LEVEL, fmt, ##args); \
- } else { \
- do_printk(BIOS_NEVER, fmt, ##args); \
- } \
+ do_printk(LEVEL, fmt, ##args); \
} while(0)
#endif
diff --git a/src/mainboard/msi/ms9652_fam10/Kconfig b/src/mainboard/msi/ms9652_fam10/Kconfig
index 852efd4..58cafa2 100644
--- a/src/mainboard/msi/ms9652_fam10/Kconfig
+++ b/src/mainboard/msi/ms9652_fam10/Kconfig
@@ -97,10 +97,6 @@ config DEFAULT_CONSOLE_LOGLEVEL
int
default 9
-config MAXIMUM_CONSOLE_LOGLEVEL
- int
- default 9
-
config MAINBOARD_POWER_ON_AFTER_POWER_FAIL
bool
default y
diff --git a/util/abuild/abuild b/util/abuild/abuild
index 1c69eec..aad066c 100755
--- a/util/abuild/abuild
+++ b/util/abuild/abuild
@@ -596,8 +596,6 @@ while true ; do
-C|--config) shift; configureonly=1;;
-l|--loglevel) shift
customizing="${customizing}, loglevel $1"
- configoptions="${configoptions}CONFIG_MAXIMUM_CONSOLE_LOGLEVEL_$1=y\n"
- configoptions="${configoptions}CONFIG_MAXIMUM_CONSOLE_LOGLEVEL=$1\n"
configoptions="${configoptions}CONFIG_DEFAULT_CONSOLE_LOGLEVEL_$1=y\n"
configoptions="${configoptions}CONFIG_DEFAULT_CONSOLE_LOGLEVEL=$1\n"
shift;;
the following patch was just integrated into master:
commit 2fde9668b47e74d1bfad2f1688a4481e6b966d04
Author: David Hendricks <dhendrix(a)chromium.org>
Date: Thu May 2 16:47:54 2013 -0700
exynos5250/snow: deprecate time.h
time.h We Hardly Knew Ye.
This deprecates time.h which is currently only used by Exynos5250 and
Snow. The original idea was to try and unify some of the various timer
interfaces and has been supplanted by the monotonic timer API.
timer_us() is now obsolete. timer_start() is now mct_start() and
is exposed in exynos5250/clk.h.
Signed-off-by: David Hendricks <dhendrix(a)chromium.org>
Change-Id: I14ebf75649d101491252c9aafea12f73ccf446b5
Reviewed-on: http://review.coreboot.org/3177
Reviewed-by: Aaron Durbin <adurbin(a)google.com>
Tested-by: build bot (Jenkins)
Reviewed-by: Paul Menzel <paulepanter(a)users.sourceforge.net>
Reviewed-by: Ronald G. Minnich <rminnich(a)gmail.com>
Build-Tested: build bot (Jenkins) at Fri May 3 05:47:46 2013, giving +1
Reviewed-By: Ronald G. Minnich <rminnich(a)gmail.com> at Fri May 3 17:27:28 2013, giving +2
See http://review.coreboot.org/3177 for details.
-gerrit
the following patch was just integrated into master:
commit 37714f33a6ac922c8e3a8e5761c0c7ac505acad1
Author: Idwer Vollering <vidwer(a)gmail.com>
Date: Fri Apr 19 00:56:57 2013 +0200
crossgcc: update to gcc 4.7.3
Update crossgcc to use gcc 4.7.3
The resulting coreboot.rom is not runtime tested (any volunteers?).
Drop the texinfo patch, rename the armv7a patch.
Some Linux distributions have moved on to gcc 4.8,
under certain circumstances this version can't (cross-)compile gcc 4.7.2
Bug report: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56927
Change-Id: Id8ce5f86c34e1a0900d44dc6ae4e81cb9548ecc2
Signed-off-by: Idwer Vollering <vidwer(a)gmail.com>
Reviewed-on: http://review.coreboot.org/3112
Tested-by: build bot (Jenkins)
Reviewed-by: Paul Menzel <paulepanter(a)users.sourceforge.net>
Reviewed-by: Martin Roth <martin.roth(a)se-eng.com>
Reviewed-by: Ronald G. Minnich <rminnich(a)gmail.com>
Build-Tested: build bot (Jenkins) at Mon Apr 22 14:27:40 2013, giving +1
Reviewed-By: Ronald G. Minnich <rminnich(a)gmail.com> at Fri May 3 17:26:47 2013, giving +2
See http://review.coreboot.org/3112 for details.
-gerrit