Ignore:
File:
1 edited

Legend:

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

    r28a5ebd r690ad20  
    3333 */
    3434
    35 #include <sysinfo/sysinfo.h>
    36 #include <synch/spinlock.h>
    37 #include <typedefs.h>
     35#include <abi/log.h>
     36#include <arch.h>
     37#include <atomic.h>
     38#include <console/console.h>
     39#include <ddi/ddi.h>
    3840#include <ddi/irq.h>
    39 #include <ddi/ddi.h>
     41#include <errno.h>
    4042#include <ipc/event.h>
    4143#include <ipc/irq.h>
    42 #include <arch.h>
     44#include <log.h>
    4345#include <panic.h>
    44 #include <putchar.h>
    45 #include <atomic.h>
     46#include <print.h>
     47#include <printf_core.h>
     48#include <stdarg.h>
     49#include <stdlib.h>
     50#include <str.h>
     51#include <synch/spinlock.h>
    4652#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>
    52 #include <log.h>
    53 #include <console/console.h>
    54 #include <abi/log.h>
    55 #include <stdlib.h>
     53#include <sysinfo/sysinfo.h>
     54#include <typedefs.h>
    5655
    5756#define LOG_PAGES    8
     
    6059
    6160/** Cyclic buffer holding the data for kernel log */
    62 uint8_t log_buffer[LOG_LENGTH] __attribute__((aligned(PAGE_SIZE)));
     61static uint8_t log_buffer[LOG_LENGTH] __attribute__((aligned(PAGE_SIZE)));
    6362
    6463/** Kernel log initialized */
     
    6665
    6766/** Position in the cyclic buffer where the first log entry starts */
    68 size_t log_start = 0;
     67static size_t log_start = 0;
    6968
    7069/** Sum of length of all log entries currently stored in the cyclic buffer */
    71 size_t log_used = 0;
     70static size_t log_used = 0;
    7271
    7372/** Log spinlock */
    74 SPINLOCK_STATIC_INITIALIZE_NAME(log_lock, "log_lock");
     73static IRQ_SPINLOCK_INITIALIZE(log_lock);
    7574
    7675/** Overall count of logged messages, which may overflow as needed */
     
    151150void log_begin(log_facility_t fac, log_level_t level)
    152151{
    153         spinlock_lock(&log_lock);
    154         spinlock_lock(&kio_lock);
     152        console_lock();
     153        irq_spinlock_lock(&log_lock, true);
     154        irq_spinlock_lock(&kio_lock, true);
    155155
    156156        log_current_start = (log_start + log_used) % LOG_LENGTH;
     
    178178        log_used += log_current_len;
    179179
    180         kio_push_char('\n');
    181         spinlock_unlock(&kio_lock);
    182         spinlock_unlock(&log_lock);
     180        kio_push_bytes("\n", 1);
     181        irq_spinlock_unlock(&kio_lock, true);
     182        irq_spinlock_unlock(&log_lock, true);
    183183
    184184        /* This has to be called after we released the locks above */
     
    186186        kio_update(NULL);
    187187        log_update(NULL);
     188        console_unlock();
    188189}
    189190
     
    193194                return;
    194195
    195         spinlock_lock(&log_lock);
     196        irq_spinlock_lock(&log_lock, true);
    196197        if (next_for_uspace < log_used)
    197198                event_notify_0(EVENT_KLOG, true);
    198         spinlock_unlock(&log_lock);
     199        irq_spinlock_unlock(&log_lock, true);
    199200}
    200201
    201202static int log_printf_str_write(const char *str, size_t size, void *data)
    202203{
    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 
     204        kio_push_bytes(str, size);
    211205        log_append((const uint8_t *)str, size);
    212 
    213         return chars;
    214 }
    215 
    216 static 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;
     206        return EOK;
    235207}
    236208
     
    241213int log_vprintf(const char *fmt, va_list args)
    242214{
    243         int ret;
    244 
    245215        printf_spec_t ps = {
    246216                log_printf_str_write,
    247                 log_printf_wstr_write,
    248217                NULL
    249218        };
    250219
    251         ret = printf_core(fmt, &ps, args);
    252 
    253         return ret;
     220        return printf_core(fmt, &ps, args);
    254221}
    255222
     
    334301                rc = EOK;
    335302
    336                 spinlock_lock(&log_lock);
     303                irq_spinlock_lock(&log_lock, true);
    337304
    338305                while (next_for_uspace < log_used) {
     
    364331                }
    365332
    366                 spinlock_unlock(&log_lock);
     333                irq_spinlock_unlock(&log_lock, true);
    367334
    368335                if (rc != EOK) {
Note: See TracChangeset for help on using the changeset viewer.