From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andrew Cooper Subject: [PATCH v2 4/5] [RFC] xen/console: Provide timestamps as an offset since boot Date: Fri, 28 Feb 2014 18:57:03 +0000 Message-ID: <1393613824-13230-5-git-send-email-andrew.cooper3@citrix.com> References: <1393613824-13230-1-git-send-email-andrew.cooper3@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1393613824-13230-1-git-send-email-andrew.cooper3@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Xen-devel Cc: Andrew Cooper List-Id: xen-devel@lists.xenproject.org This adds a new "Linux style" console timestamp method, which is shorter and more useful than the current date/time timestamps with single-second granularity. Signed-off-by: Andrew Cooper --- xen/drivers/char/console.c | 58 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 49 insertions(+), 9 deletions(-) diff --git a/xen/drivers/char/console.c b/xen/drivers/char/console.c index 532c426..652d02d 100644 --- a/xen/drivers/char/console.c +++ b/xen/drivers/char/console.c @@ -49,8 +49,17 @@ static bool_t __read_mostly opt_console_to_ring; boolean_param("console_to_ring", opt_console_to_ring); /* console_timestamps: include a timestamp prefix on every Xen console line. */ -static bool_t __read_mostly opt_console_timestamps; -boolean_param("console_timestamps", opt_console_timestamps); +enum con_timestamp_mode +{ + TSM_NONE, /* No timestamps */ + TSM_DATE, /* [YYYY-MM-DD HH:MM:SS] */ + TSM_SINCE_BOOT /* [SSSSSS.mmmmmm] */ +}; + +static enum con_timestamp_mode __read_mostly opt_con_timestamp_mode = TSM_NONE; + +static void parse_console_timestamps(char *s); +custom_param("console_timestamps", parse_console_timestamps); /* conring_size: allows a large console ring than default (16kB). */ static uint32_t __initdata opt_conring_size; @@ -546,23 +555,54 @@ static int printk_prefix_check(char *p, char **pp) ((loglvl < upper_thresh) && printk_ratelimit())); } +static void __init parse_console_timestamps(char *s) +{ + if ( *s == '\0' || /* Compat for old booleanparam() */ + !strcmp(s, "date") ) + opt_con_timestamp_mode = TSM_DATE; + else if ( !strcmp(s, "boot") ) + opt_con_timestamp_mode = TSM_SINCE_BOOT; + else if ( !strcmp(s, "none") ) + opt_con_timestamp_mode = TSM_NONE; + else + printk(XENLOG_ERR "Unrecognised timestamp mode '%s'\n", s); +} + static void printk_start_of_line(const char *prefix) { struct tm tm; char tstr[32]; + uint64_t sec, nsec; __putstr(prefix); - if ( !opt_console_timestamps ) - return; + switch ( opt_con_timestamp_mode ) + { + case TSM_DATE: + tm = wallclock_time(); + + if ( tm.tm_mday == 0 ) + return; + + if ( opt_con_timestamp_mode == TSM_DATE ) + snprintf(tstr, sizeof(tstr), "[%04u-%02u-%02u %02u:%02u:%02u] ", + 1900 + tm.tm_year, tm.tm_mon + 1, tm.tm_mday, + tm.tm_hour, tm.tm_min, tm.tm_sec); + break; + + case TSM_SINCE_BOOT: + sec = NOW(); + nsec = do_div(sec, 1000000000); - tm = wallclock_time(); - if ( tm.tm_mday == 0 ) + snprintf(tstr, sizeof(tstr), "[%5"PRIu64".%06"PRIu64"] ", + sec, nsec / 1000); + break; + + case TSM_NONE: + default: return; + } - snprintf(tstr, sizeof(tstr), "[%04u-%02u-%02u %02u:%02u:%02u] ", - 1900 + tm.tm_year, tm.tm_mon + 1, tm.tm_mday, - tm.tm_hour, tm.tm_min, tm.tm_sec); __putstr(tstr); } -- 1.7.10.4