Ignore:
Timestamp:
2025-04-10T17:55:36Z (4 days ago)
Author:
Jiří Zárevúcky <zarevucky.jiri@…>
Branches:
master
Children:
8165a7a, c0d814a
Parents:
c55ab66
git-author:
Jiří Zárevúcky <zarevucky.jiri@…> (2025-04-10 11:33:46)
git-committer:
Jiří Zárevúcky <zarevucky.jiri@…> (2025-04-10 17:55:36)
Message:

Introduce a console lock to prevent line splitting in kernel output

It is a common occurrence to see broken lines on screen or in serial
output due to bad timing. This is an attempt to prevent that without
breaking anything.

It could be considered a stopgap solution, since the whole console
stack deserves a better/faster implementation.

File:
1 edited

Legend:

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

    rc55ab66 r90dd8aee  
    3434 */
    3535
     36#include <abi/kio.h>
     37#include <arch.h>
    3638#include <assert.h>
     39#include <atomic.h>
     40#include <console/chardev.h>
    3741#include <console/console.h>
    38 #include <console/chardev.h>
    39 #include <sysinfo/sysinfo.h>
    40 #include <synch/waitq.h>
    41 #include <synch/spinlock.h>
    42 #include <typedefs.h>
     42#include <ddi/ddi.h>
    4343#include <ddi/irq.h>
    44 #include <ddi/ddi.h>
     44#include <errno.h>
    4545#include <ipc/event.h>
    4646#include <ipc/irq.h>
    47 #include <arch.h>
     47#include <mm/frame.h> /* SIZE2FRAMES */
    4848#include <panic.h>
     49#include <preemption.h>
     50#include <proc/thread.h>
     51#include <putchar.h>
     52#include <stdatomic.h>
    4953#include <stdio.h>
    50 #include <putchar.h>
    51 #include <atomic.h>
     54#include <stdlib.h>  /* malloc */
     55#include <str.h>
     56#include <synch/mutex.h>
     57#include <synch/spinlock.h>
     58#include <synch/waitq.h>
    5259#include <syscall/copy.h>
    53 #include <errno.h>
    54 #include <str.h>
    55 #include <stdatomic.h>
    56 #include <abi/kio.h>
    57 #include <mm/frame.h> /* SIZE2FRAMES */
    58 #include <stdlib.h>  /* malloc */
     60#include <sysinfo/sysinfo.h>
     61#include <typedefs.h>
    5962
    6063#define KIO_PAGES    8
     
    6669/** Kernel log initialized */
    6770static atomic_bool kio_inited = ATOMIC_VAR_INIT(false);
     71
     72/** A mutex for preventing interleaving of output lines from different threads.
     73 * May not be held in some circumstances, so locking of any internal shared
     74 * structures is still necessary.
     75 */
     76static MUTEX_INITIALIZE(console_mutex, MUTEX_RECURSIVE);
    6877
    6978/** First kernel log characters */
     
    395404}
    396405
     406/** Lock console output, ensuring that lines from different threads don't
     407 * interleave. Does nothing when preemption is disabled, so that debugging
     408 * and error printouts in sensitive areas still work.
     409 */
     410void console_lock(void)
     411{
     412        if (!PREEMPTION_DISABLED)
     413                mutex_lock(&console_mutex);
     414}
     415
     416/** Unlocks console output. See console_lock()
     417 */
     418void console_unlock(void)
     419{
     420        if (!PREEMPTION_DISABLED)
     421                mutex_unlock(&console_mutex);
     422}
     423
    397424/** @}
    398425 */
Note: See TracChangeset for help on using the changeset viewer.