Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/log/log.c

    r690ad20 r28a5ebd  
    3333 */
    3434
    35 #include <abi/log.h>
    36 #include <arch.h>
    37 #include <atomic.h>
    38 #include <console/console.h>
     35#include <sysinfo/sysinfo.h>
     36#include <synch/spinlock.h>
     37#include <typedefs.h>
     38#include <ddi/irq.h>
    3939#include <ddi/ddi.h>
    40 #include <ddi/irq.h>
    41 #include <errno.h>
    4240#include <ipc/event.h>
    4341#include <ipc/irq.h>
     42#include <arch.h>
     43#include <panic.h>
     44#include <putchar.h>
     45#include <atomic.h>
     46#include <syscall/copy.h>
     47#include <errno.h>
     48#include <str.h>
     49#include <print.h>
     50#include <printf/printf_core.h>
     51#include <stdarg.h>
    4452#include <log.h>
    45 #include <panic.h>
    46 #include <print.h>
    47 #include <printf_core.h>
    48 #include <stdarg.h>
     53#include <console/console.h>
     54#include <abi/log.h>
    4955#include <stdlib.h>
    50 #include <str.h>
    51 #include <synch/spinlock.h>
    52 #include <syscall/copy.h>
    53 #include <sysinfo/sysinfo.h>
    54 #include <typedefs.h>
    5556
    5657#define LOG_PAGES    8
     
    5960
    6061/** Cyclic buffer holding the data for kernel log */
    61 static uint8_t log_buffer[LOG_LENGTH] __attribute__((aligned(PAGE_SIZE)));
     62uint8_t log_buffer[LOG_LENGTH] __attribute__((aligned(PAGE_SIZE)));
    6263
    6364/** Kernel log initialized */
     
    6566
    6667/** Position in the cyclic buffer where the first log entry starts */
    67 static size_t log_start = 0;
     68size_t log_start = 0;
    6869
    6970/** Sum of length of all log entries currently stored in the cyclic buffer */
    70 static size_t log_used = 0;
     71size_t log_used = 0;
    7172
    7273/** Log spinlock */
    73 static IRQ_SPINLOCK_INITIALIZE(log_lock);
     74SPINLOCK_STATIC_INITIALIZE_NAME(log_lock, "log_lock");
    7475
    7576/** Overall count of logged messages, which may overflow as needed */
     
    150151void log_begin(log_facility_t fac, log_level_t level)
    151152{
    152         console_lock();
    153         irq_spinlock_lock(&log_lock, true);
    154         irq_spinlock_lock(&kio_lock, true);
     153        spinlock_lock(&log_lock);
     154        spinlock_lock(&kio_lock);
    155155
    156156        log_current_start = (log_start + log_used) % LOG_LENGTH;
     
    178178        log_used += log_current_len;
    179179
    180         kio_push_bytes("\n", 1);
    181         irq_spinlock_unlock(&kio_lock, true);
    182         irq_spinlock_unlock(&log_lock, true);
     180        kio_push_char('\n');
     181        spinlock_unlock(&kio_lock);
     182        spinlock_unlock(&log_lock);
    183183
    184184        /* This has to be called after we released the locks above */
     
    186186        kio_update(NULL);
    187187        log_update(NULL);
    188         console_unlock();
    189188}
    190189
     
    194193                return;
    195194
    196         irq_spinlock_lock(&log_lock, true);
     195        spinlock_lock(&log_lock);
    197196        if (next_for_uspace < log_used)
    198197                event_notify_0(EVENT_KLOG, true);
    199         irq_spinlock_unlock(&log_lock, true);
     198        spinlock_unlock(&log_lock);
    200199}
    201200
    202201static int log_printf_str_write(const char *str, size_t size, void *data)
    203202{
    204         kio_push_bytes(str, size);
     203        size_t offset = 0;
     204        size_t chars = 0;
     205
     206        while (offset < size) {
     207                kio_push_char(str_decode(str, &offset, size));
     208                chars++;
     209        }
     210
    205211        log_append((const uint8_t *)str, size);
    206         return EOK;
     212
     213        return chars;
     214}
     215
     216static int log_printf_wstr_write(const char32_t *wstr, size_t size, void *data)
     217{
     218        char buffer[16];
     219        size_t offset = 0;
     220        size_t chars = 0;
     221
     222        for (offset = 0; offset < size; offset += sizeof(char32_t), chars++) {
     223                kio_push_char(wstr[chars]);
     224
     225                size_t buffer_offset = 0;
     226                errno_t rc = chr_encode(wstr[chars], buffer, &buffer_offset, 16);
     227                if (rc != EOK) {
     228                        return EOF;
     229                }
     230
     231                log_append((const uint8_t *)buffer, buffer_offset);
     232        }
     233
     234        return chars;
    207235}
    208236
     
    213241int log_vprintf(const char *fmt, va_list args)
    214242{
     243        int ret;
     244
    215245        printf_spec_t ps = {
    216246                log_printf_str_write,
     247                log_printf_wstr_write,
    217248                NULL
    218249        };
    219250
    220         return printf_core(fmt, &ps, args);
     251        ret = printf_core(fmt, &ps, args);
     252
     253        return ret;
    221254}
    222255
     
    301334                rc = EOK;
    302335
    303                 irq_spinlock_lock(&log_lock, true);
     336                spinlock_lock(&log_lock);
    304337
    305338                while (next_for_uspace < log_used) {
     
    331364                }
    332365
    333                 irq_spinlock_unlock(&log_lock, true);
     366                spinlock_unlock(&log_lock);
    334367
    335368                if (rc != EOK) {
Note: See TracChangeset for help on using the changeset viewer.