--- zzzz-none-000/linux-4.1.52/kernel/printk/printk.c 2018-05-28 02:26:45.000000000 +0000 +++ bcm63-7530ax-731/linux-4.1.52/kernel/printk/printk.c 2022-03-02 11:37:13.000000000 +0000 @@ -16,6 +16,11 @@ * 01Mar01 Andrew Morton */ +#ifdef CONFIG_AVM_FASTIRQ +#include +#define CLIENT_FIQ_PRIO FIQ_PRIO_WATCHDOG +#endif + #include #include #include @@ -46,6 +51,12 @@ #include #include #include +#ifdef CONFIG_AVM_DEBUG +#include +#if defined(CONFIG_SMP) && defined(CONFIG_MIPS) +#include +#endif /*--- #if defined(CONFIG_SMP) && defined(CONFIG_MIPS) ---*/ +#endif /*--- #ifdef CONFIG_AVM_DEBUG ---*/ #include @@ -55,6 +66,30 @@ #include "console_cmdline.h" #include "braille.h" +#if defined(CONFIG_AVM_FASTIRQ) + +#include +#define __NONLINUX_CONTEXT_NAME "FastIrq" +#define _BUILD_AVM_CONTEXT_FUNC(func) firq_##func + +#define firq_start_critical_timings() if (!firq_is_avm_rte()) start_critical_timings() +#define firq_stop_critical_timings() if (!firq_is_avm_rte()) stop_critical_timings() + +/*--------------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------------*/ +static u64 firq_local_clock(void) { + unsigned long flags; + u64 clock; + firq_local_irq_save(flags); + clock = sched_clock_cpu(raw_smp_processor_id()); + firq_local_irq_restore(flags); + return clock; +} +#else +#define _BUILD_AVM_CONTEXT_FUNC(func) func +#define is_avm_rte() 0 +#endif + int console_printk[4] = { CONSOLE_LOGLEVEL_DEFAULT, /* console_loglevel */ MESSAGE_LOGLEVEL_DEFAULT, /* default_message_loglevel */ @@ -89,22 +124,26 @@ * macros instead of functions so that _RET_IP_ contains useful information. */ #define down_console_sem() do { \ - down(&console_sem);\ + _BUILD_AVM_CONTEXT_FUNC(down)(&console_sem);\ mutex_acquire(&console_lock_dep_map, 0, 0, _RET_IP_);\ } while (0) static int __down_trylock_console_sem(unsigned long ip) { - if (down_trylock(&console_sem)) + if (_BUILD_AVM_CONTEXT_FUNC(down_trylock)(&console_sem)) return 1; - mutex_acquire(&console_lock_dep_map, 0, 1, ip); + if (!_BUILD_AVM_CONTEXT_FUNC(is_avm_rte)()) { + mutex_acquire(&console_lock_dep_map, 0, 1, ip); + } return 0; } #define down_trylock_console_sem() __down_trylock_console_sem(_RET_IP_) -#define up_console_sem() do { \ - mutex_release(&console_lock_dep_map, 1, _RET_IP_);\ - up(&console_sem);\ +#define up_console_sem() do { \ + if (!_BUILD_AVM_CONTEXT_FUNC(is_avm_rte)()) { \ + mutex_release(&console_lock_dep_map, 1, _RET_IP_); \ + } \ + _BUILD_AVM_CONTEXT_FUNC(up)(&console_sem); \ } while (0) /* @@ -210,6 +249,9 @@ LOG_NEWLINE = 2, /* text ended with a newline */ LOG_PREFIX = 4, /* text started with a prefix */ LOG_CONT = 8, /* text is a fragment of a continuation line */ +#if defined(CONFIG_AVM_DEBUG) + LOG_PRINTK_AVM = 0x10, +#endif /*--- #if defined(CONFIG_AVM_DEBUG) ---*/ }; struct printk_log { @@ -220,7 +262,13 @@ u8 facility; /* syslog facility */ u8 flags:5; /* internal record flags */ u8 level:3; /* syslog level */ +#if defined(CONFIG_AVM_DEBUG) + u8 cpu; +#endif/*--- #if defined(CONFIG_AVM_DEBUG) ---*/ }; +#if defined(CONFIG_AVM_DEBUG) +static int force_printk_avm = 0; +#endif /*--- #if defined(CONFIG_AVM_DEBUG) ---*/ /* * The logbuf_lock protects kmsg buffer, indices, counters. This can be taken @@ -449,10 +497,17 @@ msg->facility = facility; msg->level = level & 7; msg->flags = flags & 0x1f; +#if defined(CONFIG_AVM_DEBUG) + if (!_BUILD_AVM_CONTEXT_FUNC(is_avm_rte)()) { + msg->cpu = raw_smp_processor_id(); + } else { + msg->cpu = raw_smp_processor_id() | 0x80; + } +#endif/*--- #if defined(CONFIG_AVM_DEBUG) ---*/ if (ts_nsec > 0) msg->ts_nsec = ts_nsec; else - msg->ts_nsec = local_clock(); + msg->ts_nsec = _BUILD_AVM_CONTEXT_FUNC(local_clock)(); memset(log_dict(msg) + dict_len, 0, pad_len); msg->len = size; @@ -576,6 +631,7 @@ char cont = '-'; size_t len; ssize_t ret; + unsigned long flags; if (!user) return -EBADF; @@ -583,20 +639,20 @@ ret = mutex_lock_interruptible(&user->lock); if (ret) return ret; - raw_spin_lock_irq(&logbuf_lock); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_lock_irqsave)(&logbuf_lock, flags); while (user->seq == log_next_seq) { if (file->f_flags & O_NONBLOCK) { ret = -EAGAIN; - raw_spin_unlock_irq(&logbuf_lock); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_unlock_irqrestore)(&logbuf_lock, flags); goto out; } - raw_spin_unlock_irq(&logbuf_lock); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_unlock_irqrestore)(&logbuf_lock, flags); ret = wait_event_interruptible(log_wait, user->seq != log_next_seq); if (ret) goto out; - raw_spin_lock_irq(&logbuf_lock); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_lock_irqsave)(&logbuf_lock, flags); } if (user->seq < log_first_seq) { @@ -604,7 +660,7 @@ user->idx = log_first_idx; user->seq = log_first_seq; ret = -EPIPE; - raw_spin_unlock_irq(&logbuf_lock); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_unlock_irqrestore)(&logbuf_lock, flags); goto out; } @@ -671,7 +727,7 @@ user->idx = log_next(user->idx); user->seq++; - raw_spin_unlock_irq(&logbuf_lock); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_unlock_irqrestore)(&logbuf_lock, flags); if (len > count) { ret = -EINVAL; @@ -692,13 +748,14 @@ { struct devkmsg_user *user = file->private_data; loff_t ret = 0; + unsigned long flags; if (!user) return -EBADF; if (offset) return -ESPIPE; - raw_spin_lock_irq(&logbuf_lock); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_lock_irqsave)(&logbuf_lock, flags); switch (whence) { case SEEK_SET: /* the first record */ @@ -722,7 +779,7 @@ default: ret = -EINVAL; } - raw_spin_unlock_irq(&logbuf_lock); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_unlock_irqrestore)(&logbuf_lock, flags); return ret; } @@ -730,13 +787,14 @@ { struct devkmsg_user *user = file->private_data; int ret = 0; + unsigned long flags; if (!user) return POLLERR|POLLNVAL; poll_wait(file, &log_wait, wait); - raw_spin_lock_irq(&logbuf_lock); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_lock_irqsave)(&logbuf_lock, flags); if (user->seq < log_next_seq) { /* return error when data has vanished underneath us */ if (user->seq < log_first_seq) @@ -744,7 +802,7 @@ else ret = POLLIN|POLLRDNORM; } - raw_spin_unlock_irq(&logbuf_lock); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_unlock_irqrestore)(&logbuf_lock, flags); return ret; } @@ -753,6 +811,7 @@ { struct devkmsg_user *user; int err; + unsigned long flags; /* write-only does not need any file context */ if ((file->f_flags & O_ACCMODE) == O_WRONLY) @@ -769,10 +828,10 @@ mutex_init(&user->lock); - raw_spin_lock_irq(&logbuf_lock); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_lock_irqsave)(&logbuf_lock, flags); user->idx = log_first_idx; user->seq = log_first_seq; - raw_spin_unlock_irq(&logbuf_lock); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_unlock_irqrestore)(&logbuf_lock, flags); file->private_data = user; return 0; @@ -911,13 +970,13 @@ return; } - raw_spin_lock_irqsave(&logbuf_lock, flags); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_lock_irqsave)(&logbuf_lock, flags); log_buf_len = new_log_buf_len; log_buf = new_log_buf; new_log_buf_len = 0; free = __LOG_BUF_LEN - log_next_idx; memcpy(log_buf, __log_buf, __LOG_BUF_LEN); - raw_spin_unlock_irqrestore(&logbuf_lock, flags); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_unlock_irqrestore)(&logbuf_lock, flags); pr_info("log_buf_len: %d bytes\n", log_buf_len); pr_info("early log buf free: %d(%d%%)\n", @@ -1033,6 +1092,12 @@ } len += print_time(msg->ts_nsec, buf ? buf + len : NULL); +#if defined(CONFIG_AVM_DEBUG) && defined(CONFIG_SMP) + if((msg->flags & LOG_PRINTK_AVM) && buf) { + if(len && buf[len-1] == ' ') len--; + len += sprintf(&buf[len], "[%s%x]", msg->cpu & 0x80 ? "F" : "", msg->cpu & ~0x80); + } +#endif /*--- #if defined(CONFIG_AVM_DEBUG) && defined(CONFIG_SMP) ---*/ return len; } @@ -1100,6 +1165,7 @@ char *text; struct printk_log *msg; int len = 0; + unsigned long flags; text = kmalloc(LOG_LINE_MAX + PREFIX_MAX, GFP_KERNEL); if (!text) @@ -1109,7 +1175,7 @@ size_t n; size_t skip; - raw_spin_lock_irq(&logbuf_lock); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_lock_irqsave)(&logbuf_lock, flags); if (syslog_seq < log_first_seq) { /* messages are gone, move to first one */ syslog_seq = log_first_seq; @@ -1118,7 +1184,7 @@ syslog_partial = 0; } if (syslog_seq == log_next_seq) { - raw_spin_unlock_irq(&logbuf_lock); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_unlock_irqrestore)(&logbuf_lock, flags); break; } @@ -1139,7 +1205,7 @@ syslog_partial += n; } else n = 0; - raw_spin_unlock_irq(&logbuf_lock); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_unlock_irqrestore)(&logbuf_lock, flags); if (!n) break; @@ -1163,12 +1229,13 @@ { char *text; int len = 0; + unsigned long flags; text = kmalloc(LOG_LINE_MAX + PREFIX_MAX, GFP_KERNEL); if (!text) return -ENOMEM; - raw_spin_lock_irq(&logbuf_lock); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_lock_irqsave)(&logbuf_lock, flags); if (buf) { u64 next_seq; u64 seq; @@ -1228,12 +1295,12 @@ seq++; prev = msg->flags; - raw_spin_unlock_irq(&logbuf_lock); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_unlock_irqrestore)(&logbuf_lock, flags); if (copy_to_user(buf + len, text, textlen)) len = -EFAULT; else len += textlen; - raw_spin_lock_irq(&logbuf_lock); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_lock_irqsave)(&logbuf_lock, flags); if (seq < log_first_seq) { /* messages are gone, move to next one */ @@ -1248,7 +1315,7 @@ clear_seq = log_next_seq; clear_idx = log_next_idx; } - raw_spin_unlock_irq(&logbuf_lock); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_unlock_irqrestore)(&logbuf_lock, flags); kfree(text); return len; @@ -1259,6 +1326,7 @@ bool clear = false; static int saved_console_loglevel = LOGLEVEL_DEFAULT; int error; + unsigned long flags; error = check_syslog_permissions(type, from_file); if (error) @@ -1335,7 +1403,7 @@ break; /* Number of chars in the log buffer */ case SYSLOG_ACTION_SIZE_UNREAD: - raw_spin_lock_irq(&logbuf_lock); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_lock_irqsave)(&logbuf_lock, flags); if (syslog_seq < log_first_seq) { /* messages are gone, move to first one */ syslog_seq = log_first_seq; @@ -1366,7 +1434,7 @@ } error -= syslog_partial; } - raw_spin_unlock_irq(&logbuf_lock); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_unlock_irqrestore)(&logbuf_lock, flags); break; /* Size of the log buffer */ case SYSLOG_ACTION_SIZE_BUFFER: @@ -1389,15 +1457,24 @@ * Call the console drivers, asking them to write out * log_buf[start] to log_buf[end - 1]. * The console_lock must be held. + * FASTIRQ-Kontext-fest */ -static void call_console_drivers(int level, const char *text, size_t len) -{ +static void call_console_drivers(int level, +#if defined(CONFIG_AVM_DEBUG) + int flags, +#endif /*--- #if defined(CONFIG_AVM_DEBUG) ---*/ + const char *text, size_t len) { struct console *con; trace_console_rcuidle(text, len); if (level >= console_loglevel && !ignore_loglevel) return; +#if defined(CONFIG_AVM_DEBUG) + if((flags & LOG_PRINTK_AVM) && (avm_debug_console_write(text, len) == 0)) { + return; + } +#endif /*--- #if defined(CONFIG_AVM_DEBUG) ---*/ if (!console_drivers) return; @@ -1408,10 +1485,10 @@ continue; if (!con->write) continue; - if (!cpu_online(smp_processor_id()) && + if (!cpu_online(raw_smp_processor_id()) && !(con->flags & CON_ANYTIME)) continue; - con->write(con, text, len); + con->write(con, text, len); } } @@ -1432,7 +1509,7 @@ debug_locks_off(); /* If a crash is occurring, make sure we can't deadlock */ - raw_spin_lock_init(&logbuf_lock); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_lock_init)(&logbuf_lock); /* And make sure that we print immediately */ sema_init(&console_sem, 1); } @@ -1469,11 +1546,17 @@ * messages from a 'printk'. Return true (and with the * console_lock held, and 'console_locked' set) if it * is successful, false otherwise. + * FASTIRQ-Kontext fest */ static int console_trylock_for_printk(void) { - unsigned int cpu = smp_processor_id(); + unsigned int cpu = raw_smp_processor_id() & ~0x80; +#if !defined(CONFIG_AVM_DEBUG) && defined(CONFIG_BCM_KF_PRINTK_INT_ENABLED) && defined(CONFIG_BCM_PRINTK_INT_ENABLED) + if(oops_in_progress || early_boot_irqs_disabled || + preempt_count() > 1 || irqs_disabled()) + return 0; +#endif if (!console_trylock()) return 0; /* @@ -1549,14 +1632,22 @@ } } -static bool cont_add(int facility, int level, const char *text, size_t len) +static bool cont_add( +#if defined(CONFIG_AVM_DEBUG) + int lflag_force_avm_printk, +#endif /*--- #if defined(CONFIG_AVM_DEBUG) ---*/ + int facility, int level, const char *text, size_t len) { if (cont.len && cont.flushed) return false; if (cont.len + len > sizeof(cont.buf)) { /* the line gets too long, split it up in separate records */ - cont_flush(LOG_CONT); + cont_flush(LOG_CONT +#if defined(CONFIG_AVM_DEBUG) + | lflag_force_avm_printk +#endif /*--- #if defined(CONFIG_AVM_DEBUG) ---*/ + ); return false; } @@ -1564,8 +1655,12 @@ cont.facility = facility; cont.level = level; cont.owner = current; - cont.ts_nsec = local_clock(); - cont.flags = 0; + cont.ts_nsec = _BUILD_AVM_CONTEXT_FUNC(local_clock)(); + cont.flags = 0 +#if defined(CONFIG_AVM_DEBUG) + | lflag_force_avm_printk +#endif /*--- #if defined(CONFIG_AVM_DEBUG) ---*/ + ; cont.cons = 0; cont.flushed = false; } @@ -1573,8 +1668,13 @@ memcpy(cont.buf + cont.len, text, len); cont.len += len; - if (cont.len > (sizeof(cont.buf) * 80) / 100) - cont_flush(LOG_CONT); + if (cont.len > (sizeof(cont.buf) * 80) / 100) { + cont_flush(LOG_CONT +#if defined(CONFIG_AVM_DEBUG) + | lflag_force_avm_printk +#endif /*--- #if defined(CONFIG_AVM_DEBUG) ---*/ + ); + } return true; } @@ -1616,25 +1716,31 @@ char *text = textbuf; size_t text_len = 0; enum log_flags lflags = 0; - unsigned long flags; + unsigned long flags = 0; int this_cpu; int printed_len = 0; bool in_sched = false; /* cpu currently holding logbuf_lock in this function */ static unsigned int logbuf_cpu = UINT_MAX; + this_cpu = raw_smp_processor_id(); + if (level == LOGLEVEL_SCHED) { level = LOGLEVEL_DEFAULT; in_sched = true; } - - boot_delay_msec(level); - printk_delay(); - + if (!_BUILD_AVM_CONTEXT_FUNC(is_avm_rte)()) { + boot_delay_msec(level); + printk_delay(); +#if defined(CONFIG_AVM_DEBUG) + } else { + facility &= ~FORCE_PRINTK_LINUX_FACILITIES_VALUE; + facility |= FORCE_PRINTK_AVM_FACILITIES_VALUE; + this_cpu |= 0x80; +#endif/*--- #if defined(CONFIG_AVM_DEBUG) ---*/ + } /* This stops the holder of console_sem just where we want him */ - local_irq_save(flags); - this_cpu = smp_processor_id(); - + _BUILD_AVM_CONTEXT_FUNC(local_irq_save)(flags); /* * Ouch, printk recursed into itself! */ @@ -1655,7 +1761,7 @@ } lockdep_off(); - raw_spin_lock(&logbuf_lock); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_lock)(&logbuf_lock); logbuf_cpu = this_cpu; if (unlikely(recursion_bug)) { @@ -1680,6 +1786,14 @@ text_len--; lflags |= LOG_NEWLINE; } +#if defined(CONFIG_AVM_DEBUG) + if (facility & FORCE_PRINTK_LINUX_FACILITIES_VALUE) { + facility &= ~FORCE_PRINTK_LINUX_FACILITIES_VALUE; + } else if (force_printk_avm || (facility & FORCE_PRINTK_AVM_FACILITIES_VALUE)) { + facility &= ~FORCE_PRINTK_AVM_FACILITIES_VALUE; + lflags |= LOG_PRINTK_AVM; /*--- force console-output over avm_debug_console_write() ---*/ + } +#endif /*--- #if defined(CONFIG_AVM_ENHANCED) ---*/ /* strip kernel syslog prefix and extract log level or control flags */ if (facility == 0) { @@ -1708,6 +1822,7 @@ if (level == LOGLEVEL_DEFAULT) level = default_message_loglevel; + if (dict) lflags |= LOG_PREFIX|LOG_NEWLINE; @@ -1717,10 +1832,18 @@ * or another task also prints continuation lines. */ if (cont.len && (lflags & LOG_PREFIX || cont.owner != current)) - cont_flush(LOG_NEWLINE); + cont_flush(LOG_NEWLINE +#if defined(CONFIG_AVM_DEBUG) + | (lflags & LOG_PRINTK_AVM) +#endif /*--- #if defined(CONFIG_AVM_DEBUG) ---*/ + ); /* buffer line if possible, otherwise store it right away */ - if (cont_add(facility, level, text, text_len)) + if (cont_add( +#if defined(CONFIG_AVM_DEBUG) + (lflags & LOG_PRINTK_AVM), +#endif /*--- #if defined(CONFIG_AVM_DEBUG) ---*/ + facility, level, text, text_len)) printed_len += text_len; else printed_len += log_store(facility, level, @@ -1739,9 +1862,16 @@ */ if (cont.len) { if (cont.owner == current && !(lflags & LOG_PREFIX)) - stored = cont_add(facility, level, text, - text_len); - cont_flush(LOG_NEWLINE); + stored = cont_add( +#if defined(CONFIG_AVM_DEBUG) + (lflags & LOG_PRINTK_AVM), +#endif /*--- #if defined(CONFIG_AVM_DEBUG) ---*/ + facility, level, text, text_len); + cont_flush(LOG_NEWLINE +#if defined(CONFIG_AVM_DEBUG) + | (lflags & LOG_PRINTK_AVM) +#endif /*--- #if defined(CONFIG_AVM_DEBUG) ---*/ + ); } if (stored) @@ -1752,9 +1882,9 @@ } logbuf_cpu = UINT_MAX; - raw_spin_unlock(&logbuf_lock); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_unlock)(&logbuf_lock); lockdep_on(); - local_irq_restore(flags); + _BUILD_AVM_CONTEXT_FUNC(local_irq_restore)(flags); /* If called from the scheduler, we can not call up(). */ if (!in_sched) { @@ -1870,10 +2000,43 @@ } EXPORT_SYMBOL(printk); -#else /* CONFIG_PRINTK */ +#ifdef CONFIG_AVM_DEBUG +asmlinkage int printk_linux(const char *fmt, ...) { + va_list args; + int r; + + va_start(args, fmt); + r = vprintk_emit(FORCE_PRINTK_LINUX_FACILITIES_VALUE, -1, NULL, 0, fmt, args); + va_end(args); + return r; +} +EXPORT_SYMBOL(printk_linux); + +/*--------------------------------------------------------------------------------*\ + * ret: old-mode: 1 bended, 0: std.printk +\*--------------------------------------------------------------------------------*/ +int printk_avm_console_bend(unsigned int activate) { + int ret = 0; +#ifdef CONFIG_AVM_DEBUG + ret = force_printk_avm; + force_printk_avm = activate ? 1 : 0; +#endif /*--- #ifdef CONFIG_AVM_DEBUG ---*/ + return ret; +} +EXPORT_SYMBOL(printk_avm_console_bend); -#define LOG_LINE_MAX 0 -#define PREFIX_MAX 0 +/*--------------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------------*/ +void vprintk_restore(void){ /* depreciated: use printk_avm_console_bend() instead */ + printk_avm_console_bend(0); +} +EXPORT_SYMBOL(vprintk_restore); +#endif /* CONFIG_AVM_ENHANCED */ + +#else /* CONFIG_PRINTK */ + +#define LOG_LINE_MAX 0 +#define PREFIX_MAX 0 static u64 syslog_seq; static u32 syslog_idx; @@ -1892,11 +2055,24 @@ } cont; static struct printk_log *log_from_idx(u32 idx) { return NULL; } static u32 log_next(u32 idx) { return 0; } -static void call_console_drivers(int level, const char *text, size_t len) {} +static void call_console_drivers(int level, +#if defined(CONFIG_AVM_DEBUG) + int flags, +#endif /*--- #if defined(CONFIG_AVM_DEBUG) ---*/ + const char *text, size_t len) {} static size_t msg_print_text(const struct printk_log *msg, enum log_flags prev, bool syslog, char *buf, size_t size) { return 0; } static size_t cont_print_text(char *text, size_t size) { return 0; } +#ifdef CONFIG_AVM_ENHANCED +static int no_vprintk(const char *fmt __maybe_unused, va_list args __maybe_unused) +{ + return 0; +} + +asmlinkage int (*vprintk)(const char *fmt, va_list args) = no_vprintk; +#endif /* CONFIG_AVM_ENHANCED */ + /* Still needs to be defined for users */ DEFINE_PER_CPU(printk_func_t, printk_func); @@ -2124,12 +2300,15 @@ return console_locked; } +/*--------------------------------------------------------------------------------*\ + * FASTIRQ-Kontext fest +\*--------------------------------------------------------------------------------*/ static void console_cont_flush(char *text, size_t size) { unsigned long flags; size_t len; - raw_spin_lock_irqsave(&logbuf_lock, flags); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_lock_irqsave)(&logbuf_lock, flags); if (!cont.len) goto out; @@ -2143,14 +2322,27 @@ goto out; len = cont_print_text(text, size); - raw_spin_unlock(&logbuf_lock); - stop_critical_timings(); - call_console_drivers(cont.level, text, len); - start_critical_timings(); - local_irq_restore(flags); +#if defined(CONFIG_BCM_KF_PRINTK_INT_ENABLED) && defined(CONFIG_BCM_PRINTK_INT_ENABLED) + _BUILD_AVM_CONTEXT_FUNC(raw_spin_unlock_irqrestore)(&logbuf_lock, flags); + call_console_drivers(cont.level, +#if defined(CONFIG_AVM_DEBUG) + cont.flags, +#endif /*--- #if defined(CONFIG_AVM_DEBUG) ---*/ + text, len); +#else + _BUILD_AVM_CONTEXT_FUNC(raw_spin_unlock)(&logbuf_lock); + _BUILD_AVM_CONTEXT_FUNC(stop_critical_timings)(); + call_console_drivers(cont.level, +#if defined(CONFIG_AVM_DEBUG) + cont.flags, +#endif /*--- #if defined(CONFIG_AVM_DEBUG) ---*/ + text, len); + _BUILD_AVM_CONTEXT_FUNC(start_critical_timings)(); + _BUILD_AVM_CONTEXT_FUNC(local_irq_restore)(flags); +#endif return; out: - raw_spin_unlock_irqrestore(&logbuf_lock, flags); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_unlock_irqrestore)(&logbuf_lock, flags); } /** @@ -2166,6 +2358,7 @@ * If there is output waiting, we wake /dev/kmsg and syslog() users. * * console_unlock(); may be called from any context. + * FASTIRQ-Kontext fest */ void console_unlock(void) { @@ -2201,7 +2394,7 @@ size_t len; int level; - raw_spin_lock_irqsave(&logbuf_lock, flags); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_lock_irqsave)(&logbuf_lock, flags); if (seen_seq != log_next_seq) { wake_klogd = true; seen_seq = log_next_seq; @@ -2246,13 +2439,25 @@ console_idx = log_next(console_idx); console_seq++; console_prev = msg->flags; - raw_spin_unlock(&logbuf_lock); - - stop_critical_timings(); /* don't trace print latency */ - call_console_drivers(level, text, len); - start_critical_timings(); - local_irq_restore(flags); +#if defined(CONFIG_BCM_KF_PRINTK_INT_ENABLED) && defined(CONFIG_BCM_PRINTK_INT_ENABLED) + _BUILD_AVM_CONTEXT_FUNC(raw_spin_unlock_irqrestore)(&logbuf_lock, flags); + call_console_drivers(level, +#if defined(CONFIG_AVM_DEBUG) + msg->flags, +#endif /*--- #if defined(CONFIG_AVM_DEBUG) ---*/ + text, len); +#else + _BUILD_AVM_CONTEXT_FUNC(raw_spin_unlock)(&logbuf_lock); + _BUILD_AVM_CONTEXT_FUNC(stop_critical_timings)(); /* don't trace print latency */ + call_console_drivers(level, +#if defined(CONFIG_AVM_DEBUG) + msg->flags, +#endif /*--- #if defined(CONFIG_AVM_DEBUG) ---*/ + text, len); + _BUILD_AVM_CONTEXT_FUNC(start_critical_timings)(); + _BUILD_AVM_CONTEXT_FUNC(local_irq_restore)(flags); +#endif if (do_cond_resched) cond_resched(); } @@ -2262,7 +2467,7 @@ if (unlikely(exclusive_console)) exclusive_console = NULL; - raw_spin_unlock(&logbuf_lock); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_unlock)(&logbuf_lock); up_console_sem(); @@ -2272,14 +2477,14 @@ * there's a new owner and the console_unlock() from them will do the * flush, no worries. */ - raw_spin_lock(&logbuf_lock); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_lock)(&logbuf_lock); retry = console_seq != log_next_seq; - raw_spin_unlock_irqrestore(&logbuf_lock, flags); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_unlock_irqrestore)(&logbuf_lock, flags); if (retry && console_trylock()) goto again; - if (wake_klogd) + if (wake_klogd && !_BUILD_AVM_CONTEXT_FUNC(is_avm_rte)()) wake_up_klogd(); } EXPORT_SYMBOL(console_unlock); @@ -2532,11 +2737,11 @@ * console_unlock(); will print out the buffered messages * for us. */ - raw_spin_lock_irqsave(&logbuf_lock, flags); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_lock_irqsave)(&logbuf_lock, flags); console_seq = syslog_seq; console_idx = syslog_idx; console_prev = syslog_prev; - raw_spin_unlock_irqrestore(&logbuf_lock, flags); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_unlock_irqrestore)(&logbuf_lock, flags); /* * We're about to replay the log buffer. Only do this to the * just-registered console to avoid excessive message spam to @@ -2572,7 +2777,7 @@ int unregister_console(struct console *console) { - struct console *a, *b; + struct console *a, *b; int res; pr_info("%sconsole [%s%d] disabled\n", @@ -2718,9 +2923,38 @@ } EXPORT_SYMBOL(printk_timed_ratelimit); + +DEFINE_RATELIMIT_STATE(bcm_printk_ratelimit_state, 30 * HZ, 10); + +int __bcm_printk_ratelimit(const char *func) +{ + return ___ratelimit(&bcm_printk_ratelimit_state, func); +} +EXPORT_SYMBOL(__bcm_printk_ratelimit); + + static DEFINE_SPINLOCK(dump_list_lock); static LIST_HEAD(dump_list); +#if defined(CONFIG_AVM_DEBUG) +bool kmsg_dump_get_buffer_nocontext(bool syslog, char *buf, size_t size, size_t *len) { + struct kmsg_dumper _dumper, *dumper; + unsigned long flags; + + dumper = &_dumper; + /* initialize iterator with data about the stored records */ + dumper->active = true; + _BUILD_AVM_CONTEXT_FUNC(raw_spin_lock_irqsave)(&logbuf_lock, flags); + dumper->cur_seq = clear_seq; + dumper->cur_idx = clear_idx; + dumper->next_seq = log_next_seq; + dumper->next_idx = log_next_idx; + _BUILD_AVM_CONTEXT_FUNC(raw_spin_unlock_irqrestore)(&logbuf_lock, flags); + + return kmsg_dump_get_buffer(dumper, 0, buf, size, len); +} +#endif /*--- #if defined(CONFIG_AVM_DEBUG) ---*/ + /** * kmsg_dump_register - register a kernel log dumper. * @dumper: pointer to the kmsg_dumper structure @@ -2738,14 +2972,14 @@ if (!dumper->dump) return -EINVAL; - spin_lock_irqsave(&dump_list_lock, flags); + _BUILD_AVM_CONTEXT_FUNC(spin_lock_irqsave)(&dump_list_lock, flags); /* Don't allow registering multiple times */ if (!dumper->registered) { dumper->registered = 1; list_add_tail_rcu(&dumper->list, &dump_list); err = 0; } - spin_unlock_irqrestore(&dump_list_lock, flags); + _BUILD_AVM_CONTEXT_FUNC(spin_unlock_irqrestore)(&dump_list_lock, flags); return err; } @@ -2763,13 +2997,13 @@ unsigned long flags; int err = -EINVAL; - spin_lock_irqsave(&dump_list_lock, flags); + _BUILD_AVM_CONTEXT_FUNC(spin_lock_irqsave)(&dump_list_lock, flags); if (dumper->registered) { dumper->registered = 0; list_del_rcu(&dumper->list); err = 0; } - spin_unlock_irqrestore(&dump_list_lock, flags); + _BUILD_AVM_CONTEXT_FUNC(spin_unlock_irqrestore)(&dump_list_lock, flags); synchronize_rcu(); return err; @@ -2803,12 +3037,12 @@ /* initialize iterator with data about the stored records */ dumper->active = true; - raw_spin_lock_irqsave(&logbuf_lock, flags); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_lock_irqsave)(&logbuf_lock, flags); dumper->cur_seq = clear_seq; dumper->cur_idx = clear_idx; dumper->next_seq = log_next_seq; dumper->next_idx = log_next_idx; - raw_spin_unlock_irqrestore(&logbuf_lock, flags); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_unlock_irqrestore)(&logbuf_lock, flags); /* invoke dumper which will iterate over records */ dumper->dump(dumper, reason); @@ -2893,9 +3127,9 @@ unsigned long flags; bool ret; - raw_spin_lock_irqsave(&logbuf_lock, flags); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_lock_irqsave)(&logbuf_lock, flags); ret = kmsg_dump_get_line_nolock(dumper, syslog, line, size, len); - raw_spin_unlock_irqrestore(&logbuf_lock, flags); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_unlock_irqrestore)(&logbuf_lock, flags); return ret; } @@ -2935,7 +3169,7 @@ if (!dumper->active) goto out; - raw_spin_lock_irqsave(&logbuf_lock, flags); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_lock_irqsave)(&logbuf_lock, flags); if (dumper->cur_seq < log_first_seq) { /* messages are gone, move to first available one */ dumper->cur_seq = log_first_seq; @@ -2944,7 +3178,7 @@ /* last entry */ if (dumper->cur_seq >= dumper->next_seq) { - raw_spin_unlock_irqrestore(&logbuf_lock, flags); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_unlock_irqrestore)(&logbuf_lock, flags); goto out; } @@ -2991,7 +3225,7 @@ dumper->next_seq = next_seq; dumper->next_idx = next_idx; ret = true; - raw_spin_unlock_irqrestore(&logbuf_lock, flags); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_unlock_irqrestore)(&logbuf_lock, flags); out: if (len) *len = l; @@ -3029,9 +3263,9 @@ { unsigned long flags; - raw_spin_lock_irqsave(&logbuf_lock, flags); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_lock_irqsave)(&logbuf_lock, flags); kmsg_dump_rewind_nolock(dumper); - raw_spin_unlock_irqrestore(&logbuf_lock, flags); + _BUILD_AVM_CONTEXT_FUNC(raw_spin_unlock_irqrestore)(&logbuf_lock, flags); } EXPORT_SYMBOL_GPL(kmsg_dump_rewind);