Dne 30.04.2010 (pet) ob 15:45 -0700 je Randy Dunlap zapisal(a):
> On Sat, 01 May 2010 00:03:00 +0200 Samo Pogacnik wrote:
> 
> > Hi,
> 
> > diff --git a_linux-2.6.33.3/drivers/char/Kconfig 
> > b_linux-2.6.33.3/drivers/char/Kconfig
> > index e023682..b5d0909 100644
> > --- a_linux-2.6.33.3/drivers/char/Kconfig
> > +++ b_linux-2.6.33.3/drivers/char/Kconfig
> > @@ -66,6 +66,23 @@ config VT_CONSOLE
> >  
> >       If unsure, say Y.
> >  
> > +config VT_CONSOLE_DETOUR
> > +   bool "Support for VT console detour via printk"
> > +   depends on VT_CONSOLE
> > +   default n
> > +   ---help---
> > +     If you do say Y here, the support for writing console messages via
> 
>         If you say Y here,
> 
> > +     printk is included into VT console code.
> > +
> > +     The feature is usefull to catch all console log. In order to use this
> 
>                        useful                       log messages.
> 
> > +     feature, you should specify kernel command line option "detour" or 
> > write a
> > +     positive number into /proc/sys/kernel/console_detour. You can disable
> > +     the feature on-line by writing zero into the proc file. By writing a
> > +     negative value into the proc file, the feature is disabled permanently
> > +     (until next boot).
> > +
> > +     If unsure, say N.
> > +
> >  config HW_CONSOLE
> >     bool
> >     depends on VT && !S390 && !UML
> 
> > diff --git a_linux-2.6.33.3/drivers/serial/Kconfig 
> > b_linux-2.6.33.3/drivers/serial/Kconfig
> > index 9ff47db..20acfab 100644
> > --- a_linux-2.6.33.3/drivers/serial/Kconfig
> > +++ b_linux-2.6.33.3/drivers/serial/Kconfig
> > @@ -1031,6 +1031,23 @@ config SERIAL_CORE
> >  config SERIAL_CORE_CONSOLE
> >     bool
> >  
> > +config SERIAL_CORE_CONSOLE_DETOUR
> > +   bool "Support for serial console detour via printk"
> > +   depends on SERIAL_CORE_CONSOLE
> > +   default n
> > +   ---help---
> > +     If you do say Y here, the support for writing console messages via
> 
>         If you say Y here,
> 
> > +     printk is included into serial console code. 
> > +
> > +     The feature is usefull to catch all console log. In order to use this
> 
>                        useful                       log messages.
> 
> > +     feature, you should specify kernel command line option "detour" or 
> > write a
> > +     positive number into /proc/sys/kernel/console_detour. You can disable
> > +     the feature on-line by writing zero into the proc file. By writing a
> > +     negative value into the proc file, the feature is disabled permanently
> > +     (until next boot).
> > +
> > +     If unsure, say N.
> > +
> 
> The kernel command line option needs to be added to 
> Documentation/kernel-parameters.txt
> also, please.
> 
> >  config CONSOLE_POLL
> >     bool
> >  
> > diff --git a_linux-2.6.33.3/include/linux/console.h 
> > b_linux-2.6.33.3/include/linux/console.h
> > index dcca533..bc88030 100644
> > --- a_linux-2.6.33.3/include/linux/console.h
> > +++ b_linux-2.6.33.3/include/linux/console.h
> > @@ -108,6 +108,12 @@ struct console {
> >     struct   console *next;
> >  };
> >  
> > +extern int console_detour;
> > +extern void console_printk_detour(const unsigned char *, int);
> 
> Please include parameter names in function prototype(s).
> 
> > +
> > +struct ctl_table;
> > +int detour_sysctl_handler(struct ctl_table *, int, void __user *, size_t 
> > *, loff_t *);
> 
> ditto
> 
> > +
> >  extern int console_set_on_cmdline;
> >  
> >  extern int add_preferred_console(char *name, int idx, char *options);
> 
> 
> Looks interesting/useful to me.  Thanks.
> 
> ---
> ~Randy
> *** Remember to use Documentation/SubmitChecklist when testing your code ***

Hi, 

Here is the updated patch providing your hints and generalized for any
console type.

regards, Samo

---

Signed-off-by: Samo Pogacnik <samo_pogac...@t-2.net>
diff --git a_linux-2.6.33.3/Documentation/kernel-parameters.txt 
b_linux-2.6.33.3/Documentation/kernel-parameters.txt
index e2c7487..ab0072c 100644
--- a_linux-2.6.33.3/Documentation/kernel-parameters.txt
+++ b_linux-2.6.33.3/Documentation/kernel-parameters.txt
@@ -628,6 +628,8 @@ and is between 256 and 4096 characters. It is defined in 
the file
                        Defaults to the default architecture's huge page size
                        if not specified.
 
+       detour          [KNL] Enable console logging detour via printk.
+
        dhash_entries=  [KNL]
                        Set number of hash buckets for dentry cache.
 
diff --git a_linux-2.6.33.3/drivers/char/Kconfig 
b_linux-2.6.33.3/drivers/char/Kconfig
index e023682..43c552e 100644
--- a_linux-2.6.33.3/drivers/char/Kconfig
+++ b_linux-2.6.33.3/drivers/char/Kconfig
@@ -88,6 +88,22 @@ config VT_HW_CONSOLE_BINDING
         information. For framebuffer console users, please refer to
         <file:Documentation/fb/fbcon.txt>.
 
+config CONSOLE_DETOUR
+       bool "Support for console detour via printk"
+       default n
+       ---help---
+         If you say Y here, the support for writing console messages via
+         printk is included into the console code.
+
+         The feature is useful to catch all console log messages.
+         In order to use this feature, you should specify kernel command line
+         option "detour" or write a positive number into
+         /proc/sys/kernel/console_detour. You can disable the feature on-line
+         by writing zero into the proc file. By writing a negative value into
+         the proc file, the feature is disabled permanently (until next boot).
+
+         If unsure, say N.
+
 config DEVKMEM
        bool "/dev/kmem virtual device support"
        default y
diff --git a_linux-2.6.33.3/drivers/char/tty_io.c 
b_linux-2.6.33.3/drivers/char/tty_io.c
index 76253cf..f77de34 100644
--- a_linux-2.6.33.3/drivers/char/tty_io.c
+++ b_linux-2.6.33.3/drivers/char/tty_io.c
@@ -1087,6 +1087,13 @@ ssize_t redirected_tty_write(struct file *file, const 
char __user *buf,
        }
        spin_unlock(&redirect_lock);
 
+#ifdef CONFIG_CONSOLE_DETOUR
+       if (console_detour) {
+               console_printk_detour(buf, count);
+               if (!p)
+                       return count;
+       }
+#endif
        if (p) {
                ssize_t res;
                res = vfs_write(p, buf, count, &p->f_pos);
diff --git a_linux-2.6.33.3/include/linux/console.h 
b_linux-2.6.33.3/include/linux/console.h
index dcca533..354a7a8 100644
--- a_linux-2.6.33.3/include/linux/console.h
+++ b_linux-2.6.33.3/include/linux/console.h
@@ -108,6 +108,13 @@ struct console {
        struct   console *next;
 };
 
+extern int console_detour;
+extern void console_printk_detour(const unsigned char *buf, int count);
+
+struct ctl_table;
+int detour_sysctl_handler(struct ctl_table *table, int write,
+               void __user *buffer, size_t *length, loff_t *ppos);
+
 extern int console_set_on_cmdline;
 
 extern int add_preferred_console(char *name, int idx, char *options);
diff --git a_linux-2.6.33.3/init/main.c b_linux-2.6.33.3/init/main.c
index 512ba15..add9e95 100644
--- a_linux-2.6.33.3/init/main.c
+++ b_linux-2.6.33.3/init/main.c
@@ -25,6 +25,7 @@
 #include <linux/bootmem.h>
 #include <linux/acpi.h>
 #include <linux/tty.h>
+#include <linux/console.h>
 #include <linux/gfp.h>
 #include <linux/percpu.h>
 #include <linux/kmod.h>
@@ -249,6 +250,14 @@ static int __init loglevel(char *str)
 
 early_param("loglevel", loglevel);
 
+static int __init detour(char *str)
+{
+       console_detour = 1;
+       return 0;
+}
+
+early_param("detour", detour);
+
 /*
  * Unknown boot options get handed to init, unless they look like
  * unused parameters (modprobe will find them in /proc/cmdline).
diff --git a_linux-2.6.33.3/kernel/printk.c b_linux-2.6.33.3/kernel/printk.c
index 1751c45..953c6ea 100644
--- a_linux-2.6.33.3/kernel/printk.c
+++ b_linux-2.6.33.3/kernel/printk.c
@@ -1368,6 +1368,51 @@ static int __init disable_boot_consoles(void)
 }
 late_initcall(disable_boot_consoles);
 
+/*
+ * This option can be enabled with kernel command line option "detour" or
+ * through a proc file (/proc/sys/kernel/console_detour). It enables console
+ * logging through printk, if supported by enabled console.
+ */
+int console_detour;
+EXPORT_SYMBOL(console_detour);
+
+#define DETOUR_STR_SIZE 512
+void console_printk_detour(const unsigned char *buf, int count)
+{
+       char tmp[DETOUR_STR_SIZE + 1];
+
+       do {
+               if (count > DETOUR_STR_SIZE) {
+                       memcpy(tmp, buf, DETOUR_STR_SIZE);
+                       tmp[DETOUR_STR_SIZE] = '\0';
+               } else {
+                       memcpy(tmp, buf, count);
+                       tmp[count] = '\0';
+               }
+               count -= DETOUR_STR_SIZE;
+               printk(KERN_INFO "%s", tmp);
+       } while (count > 0);
+}
+EXPORT_SYMBOL(console_printk_detour);
+
+int detour_sysctl_handler(struct ctl_table *table, int write,
+       void __user *buffer, size_t *length, loff_t *ppos)
+{
+       static int disable_forever;
+
+       proc_dointvec(table, write, buffer, length, ppos);
+       if (write) {
+               if ((console_detour < 0) || (disable_forever != 0)) {
+                       disable_forever = 1;
+                       console_detour = 0;
+                       return 0;
+               }
+               if (console_detour > 1)
+                       console_detour = 1;
+       }
+       return 0;
+}
+
 #if defined CONFIG_PRINTK
 
 /*
diff --git a_linux-2.6.33.3/kernel/sysctl.c b_linux-2.6.33.3/kernel/sysctl.c
index 8a68b24..ab644cb 100644
--- a_linux-2.6.33.3/kernel/sysctl.c
+++ b_linux-2.6.33.3/kernel/sysctl.c
@@ -50,6 +50,7 @@
 #include <linux/ftrace.h>
 #include <linux/slow-work.h>
 #include <linux/perf_event.h>
+#include <linux/console.h>
 
 #include <asm/uaccess.h>
 #include <asm/processor.h>
@@ -936,6 +937,13 @@ static struct ctl_table kern_table[] = {
                .proc_handler   = proc_dointvec,
        },
 #endif
+       {
+               .procname       = "console_detour",
+               .data           = &console_detour,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &detour_sysctl_handler,
+       },
 /*
  * NOTE: do not add new entries to this table unless you have read
  * Documentation/sysctl/ctl_unnumbered.txt


--
To unsubscribe from this list: send the line "unsubscribe linux-embedded" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to