diff -urP -X patch.exclude linux-2.4.0-test9-kb-rts/kernel/printk.c linux/kernel/printk.c --- linux-2.4.0-test9-kb-rts/kernel/printk.c Wed Jul 5 11:00:21 2000 +++ linux/kernel/printk.c Thu Nov 2 10:17:20 2000 @@ -312,6 +312,64 @@ return i; } +#if defined(CONFIG_KGDB) && defined(CONFIG_PREEMPT) +asmlinkage int printk_unlocked(const char *fmt, ...) +{ + va_list args; + int i; + char *msg, *p, *buf_end; + int line_feed; + static signed char msg_level = -1; + + va_start(args, fmt); + i = vsprintf(buf + 3, fmt, args); /* hopefully i < sizeof(buf)-4 */ + buf_end = buf + 3 + i; + va_end(args); + for (p = buf + 3; p < buf_end; p++) { + msg = p; + if (msg_level < 0) { + if ( + p[0] != '<' || + p[1] < '0' || + p[1] > '7' || + p[2] != '>' + ) { + p -= 3; + p[0] = '<'; + p[1] = default_message_loglevel + '0'; + p[2] = '>'; + } else + msg += 3; + msg_level = p[1] - '0'; + } + line_feed = 0; + for (; p < buf_end; p++) { + log_buf[(log_start+log_size) & LOG_BUF_MASK] = *p; + if (log_size < LOG_BUF_LEN) + log_size++; + else + log_start++; + + logged_chars++; + if (*p == '\n') { + line_feed = 1; + break; + } + } + if (msg_level < console_loglevel && console_drivers) { + struct console *c = console_drivers; + while(c) { + if ((c->flags & CON_ENABLED) && c->write) + c->write(c, msg, p - msg + line_feed); + c = c->next; + } + } + if (line_feed) + msg_level = -1; + } + return i; +} +#endif void console_print(const char *s) { struct console *c;