X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=common%2Fcmd_log.c;h=ee291c1b4da36633021b50b8daa6ef8fc24bf6e6;hb=b045a23773f0b10071fb06e3364c7f21495f66b0;hp=8132570773fc77e4946362497f74e09178330ddc;hpb=d1cbe85b084ce543ba0b09def03a1b20940e6c03;p=u-boot diff --git a/common/cmd_log.c b/common/cmd_log.c index 8132570773..ee291c1b4d 100644 --- a/common/cmd_log.c +++ b/common/cmd_log.c @@ -1,5 +1,5 @@ /* - * (C) Copyright 2002 + * (C) Copyright 2002-2007 * Detlev Zundel, DENX Software Engineering, dzu@denx.de. * * Code used from linux/kernel/printk.c @@ -42,15 +42,15 @@ #include #include -#include +#include #include #include -#if defined(CONFIG_LOGBUFFER) +DECLARE_GLOBAL_DATA_PTR; /* Local prototypes */ -static void logbuff_putc (const char c); -static void logbuff_puts (const char *s); +static void logbuff_putc(const char c); +static void logbuff_puts(const char *s); static int logbuff_printk(const char *line); static char buf[1024]; @@ -58,50 +58,91 @@ static char buf[1024]; /* This combination will not print messages with the default loglevel */ static unsigned console_loglevel = 3; static unsigned default_message_loglevel = 4; -static unsigned char *log_buf = NULL; -static unsigned long *ext_log_size; -static unsigned long *ext_log_start; -static unsigned long *ext_logged_chars; -#define log_size (*ext_log_size) -#define log_start (*ext_log_start) -#define logged_chars (*ext_logged_chars) +static unsigned log_version = 1; +#ifdef CONFIG_ALT_LB_ADDR +static volatile logbuff_t *log; +#else +static logbuff_t *log; +#endif +static char *lbuf; -/* Forced by code, eh! */ -#define LOGBUFF_MAGIC 0xc0de4ced +unsigned long __logbuffer_base(void) +{ + return CONFIG_SYS_SDRAM_BASE + gd->ram_size - LOGBUFF_LEN; +} +unsigned long logbuffer_base(void) +__attribute__((weak, alias("__logbuffer_base"))); -/* The mapping used here has to be the same as in setup_ext_logbuff () - in linux/kernel/printk */ -void logbuff_init_ptrs (void) +void logbuff_init_ptrs(void) { - DECLARE_GLOBAL_DATA_PTR; + unsigned long tag, post_word; char *s; - log_buf = (unsigned char *)(gd->bd->bi_memsize-LOGBUFF_LEN); - ext_log_start = (unsigned long *)(log_buf)-3; - ext_log_size = (unsigned long *)(log_buf)-2; - ext_logged_chars = (unsigned long *)(log_buf)-1; +#ifdef CONFIG_ALT_LB_ADDR + log = (logbuff_t *)CONFIG_ALT_LH_ADDR; + lbuf = (char *)CONFIG_ALT_LB_ADDR; +#else + log = (logbuff_t *)(logbuffer_base()) - 1; + lbuf = (char *)log->buf; +#endif + + /* Set up log version */ + if ((s = getenv ("logversion")) != NULL) + log_version = (int)simple_strtoul(s, NULL, 10); + + if (log_version == 2) + tag = log->v2.tag; + else + tag = log->v1.tag; + post_word = post_word_load(); #ifdef CONFIG_POST /* The post routines have setup the word so we can simply test it */ - if (post_word_load () & POST_POWERON) { - logged_chars = log_size = log_start = 0; - } + if (tag != LOGBUFF_MAGIC || (post_word & POST_COLDBOOT)) + logbuff_reset(); #else /* No post routines, so we do our own checking */ - if (post_word_load () != LOGBUFF_MAGIC) { - logged_chars = log_size = log_start = 0; + if (tag != LOGBUFF_MAGIC || post_word != LOGBUFF_MAGIC) { + logbuff_reset (); post_word_store (LOGBUFF_MAGIC); - } + } #endif + if (log_version == 2 && (long)log->v2.start > (long)log->v2.con) + log->v2.start = log->v2.con; + /* Initialize default loglevel if present */ if ((s = getenv ("loglevel")) != NULL) - console_loglevel = (int)simple_strtoul (s, NULL, 10); + console_loglevel = (int)simple_strtoul(s, NULL, 10); - gd->post_log_word |= LOGBUFF_INITIALIZED; + gd->flags |= GD_FLG_LOGINIT; } -int drv_logbuff_init (void) +void logbuff_reset(void) { - device_t logdev; +#ifndef CONFIG_ALT_LB_ADDR + memset(log, 0, sizeof(logbuff_t)); +#endif + if (log_version == 2) { + log->v2.tag = LOGBUFF_MAGIC; +#ifdef CONFIG_ALT_LB_ADDR + log->v2.start = 0; + log->v2.con = 0; + log->v2.end = 0; + log->v2.chars = 0; +#endif + } else { + log->v1.tag = LOGBUFF_MAGIC; +#ifdef CONFIG_ALT_LB_ADDR + log->v1.dummy = 0; + log->v1.start = 0; + log->v1.size = 0; + log->v1.chars = 0; +#endif + } +} + +int drv_logbuff_init(void) +{ + struct stdio_dev logdev; int rc; /* Device initialization */ @@ -113,33 +154,33 @@ int drv_logbuff_init (void) logdev.putc = logbuff_putc; /* 'putc' function */ logdev.puts = logbuff_puts; /* 'puts' function */ - rc = device_register (&logdev); + rc = stdio_register(&logdev); return (rc == 0) ? 1 : rc; } -static void logbuff_putc (const char c) +static void logbuff_putc(const char c) { char buf[2]; buf[0] = c; buf[1] = '\0'; - logbuff_printk (buf); + logbuff_printk(buf); } -static void logbuff_puts (const char *s) +static void logbuff_puts(const char *s) { logbuff_printk (s); } void logbuff_log(char *msg) { - DECLARE_GLOBAL_DATA_PTR; - - if ((gd->post_log_word & LOGBUFF_INITIALIZED)) { - logbuff_printk (msg); + if ((gd->flags & GD_FLG_LOGINIT)) { + logbuff_printk(msg); } else { - /* Can happen only for pre-relocated errors as logging */ - /* at that stage should be disabled */ + /* + * Can happen only for pre-relocated errors as logging + * at that stage should be disabled + */ puts (msg); } } @@ -154,20 +195,16 @@ void logbuff_log(char *msg) * Return: None * */ -int do_log (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) +int do_log(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { char *s; - unsigned long i; + unsigned long i, start, size; - if (strcmp(argv[1],"append") == 0) { + if (strcmp(argv[1], "append") == 0) { /* Log concatenation of all arguments separated by spaces */ - for (i=2; iv2.start; + size = log->v2.end - log->v2.start; + } else { + start = log->v1.start; + size = log->v1.size; + } + if (size > LOGBUFF_LEN) + size = LOGBUFF_LEN; + for (i = 0; i < size; i++) { + s = lbuf + ((start + i) & LOGBUFF_MASK); + putc(*s); } return 0; - } else if (strcmp(argv[1],"reset") == 0) { - log_start = 0; - log_size = 0; - logged_chars = 0; + } else if (strcmp(argv[1], "reset") == 0) { + logbuff_reset(); return 0; - } else if (strcmp(argv[1],"info") == 0) { - printf ("Logbuffer at %08lx\n", (unsigned long)log_buf); - printf ("log_start = %08lx\n", log_start); - printf ("log_size = %08lx\n", log_size); - printf ("logged_chars = %08lx\n", logged_chars); + } else if (strcmp(argv[1], "info") == 0) { + printf("Logbuffer at %08lx\n", (unsigned long)lbuf); + if (log_version == 2) { + printf("log_start = %08lx\n", + log->v2.start); + printf("log_end = %08lx\n", log->v2.end); + printf("log_con = %08lx\n", log->v2.con); + printf("logged_chars = %08lx\n", + log->v2.chars); + } + else { + printf("log_start = %08lx\n", + log->v1.start); + printf("log_size = %08lx\n", + log->v1.size); + printf("logged_chars = %08lx\n", + log->v1.chars); + } return 0; } - printf ("Usage:\n%s\n", cmdtp->usage); - return 1; + return CMD_RET_USAGE; default: - printf ("Usage:\n%s\n", cmdtp->usage); - return 1; + return CMD_RET_USAGE; } } -#if defined(CONFIG_LOGBUFFER) -cmd_tbl_t U_BOOT_CMD(LOG) = MK_CMD_ENTRY( - "log", 255, 1, do_log, - "log - manipulate logbuffer\n", - "log info - show pointer details\n" + +U_BOOT_CMD( + log, 255, 1, do_log, + "manipulate logbuffer", + "info - show pointer details\n" "log reset - clear contents\n" "log show - show contents\n" - "log append - append to the logbuffer\n" + "log append - append to the logbuffer" ); -#endif /* CONFIG_LOGBUFFER */ + static int logbuff_printk(const char *line) { int i; @@ -218,8 +273,8 @@ static int logbuff_printk(const char *line) int line_feed; static signed char msg_level = -1; - strcpy (buf + 3, line); - i = strlen (line); + strcpy(buf + 3, line); + i = strlen(line); buf_end = buf + 3 + i; for (p = buf + 3; p < buf_end; p++) { msg = p; @@ -234,19 +289,28 @@ static int logbuff_printk(const char *line) p[0] = '<'; p[1] = default_message_loglevel + '0'; p[2] = '>'; - } else + } else { msg += 3; + } msg_level = p[1] - '0'; } line_feed = 0; for (; p < buf_end; p++) { - log_buf[(log_start+log_size) & LOGBUFF_MASK] = *p; - if (log_size < LOGBUFF_LEN) - log_size++; - else - log_start++; - - logged_chars++; + if (log_version == 2) { + lbuf[log->v2.end & LOGBUFF_MASK] = *p; + log->v2.end++; + if (log->v2.end - log->v2.start > LOGBUFF_LEN) + log->v2.start++; + log->v2.chars++; + } else { + lbuf[(log->v1.start + log->v1.size) & + LOGBUFF_MASK] = *p; + if (log->v1.size < LOGBUFF_LEN) + log->v1.size++; + else + log->v1.start++; + log->v1.chars++; + } if (*p == '\n') { line_feed = 1; break; @@ -260,5 +324,3 @@ static int logbuff_printk(const char *line) } return i; } - -#endif /* (CONFIG_LOGBUFFER) */