Re: early_printk accessing __log_buf

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Andrew Morton wrote:
On Wed, 18 Jul 2007 19:39:46 -0400
Robin Getz <[email protected]> wrote:

On Wed 18 Jul 2007 18:16, Andrew Morton pondered:
I'd suggest that any interface into here should be via function calls,
not via direct access to printk internals: think up some nice
copy_me_some_of_the_log_buffer() interface.
If so - I would still like to put it in:
 - ifdef CONFIG_EARLY_PRINTK
 - and define as __init

so that people don't use it when they shouldn't (when the kernel is up an running).

Something simple like - early_copy_log_buff(void *dest, size_t n) copies n bytes from log_buf to memory area dest. Returns number of bytes that could not be copied. Can find out how many bytes are in the log_buff by calling with zero size.

This is not destructive to existing interfaces (log_start and con_start are not updated/used). This should ensure that if booting does work - that normal messages come out the standard method.

Any other suggestions?


When I was at $EARLIER_EMPLOYER, we had code in there to copy the last
kilobyte-odd of the log buffer into flash when the box oopsed.

So there's one instance proof that something more general would be needed. Probably there are others, but they'll mainly be in the consumer/embedded
area, and those sorts of engineers don't read this mailing list much.


We log everything to SRAM so having the option to select the buffer destination address would be nice. My crude way of doing it:

--- 2.6.21/kernel/printk.c@@/main/1      2007-04-27 05:34:35.000000000
-0400
+++ 2.6.21/kernel/printk.c@@/main/2      2007-05-01 02:27:18.000000000 -0400
@@ -94,7 +94,12 @@
  */
static unsigned long log_start; /* Index into log_buf: next char to be read by syslog() */ static unsigned long con_start; /* Index into log_buf: next char to be sent to consoles */
+#ifndef CONFIG_LOG_BUF_ALTERNATE_ADRS
static unsigned long log_end; /* Index into log_buf: most-recently-written-char + 1 */
+#else
+extern int alt_log_end_adrs;
+#define log_end (*(unsigned long*)alt_log_end_adrs)
+#endif

 /*
  *     Array of consoles built from command line options (console=)
@@ -117,8 +122,14 @@

 #ifdef CONFIG_PRINTK

+#ifndef CONFIG_LOG_BUF_ALTERNATE_ADRS
 static char __log_buf[__LOG_BUF_LEN];
 static char *log_buf = __log_buf;
+#else
+extern int alt_log_buf_adrs;
+#define __log_buf ((unsigned char*)alt_log_buf_adrs)
+#define log_buf ((unsigned char*)alt_log_buf_adrs)
+#endif
 static int log_buf_len = __LOG_BUF_LEN;
static unsigned long logged_chars; /* Number of chars produced since last read+clear operation */


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux