Console

Struct Console

enumcons_flags

General console flags

Constants

CON_PRINTBUFFER

Used by newly registered consoles to avoid duplicateoutput of messages that were already shown by bootconsoles or read by userspace viasyslog() syscall.

CON_CONSDEV

Indicates that the console driver is backing/dev/console.

CON_ENABLED

Indicates if a console is allowed to print records. Iffalse, the console also will not advance to laterrecords.

CON_BOOT

Marks the console driver as early console driver whichis used during boot before the real driver becomesavailable. It will be automatically unregisteredwhen the real console driver is registered unless“keep_bootcon” parameter is used.

CON_ANYTIME

A misnomed historical flag which tells the core codethat the legacyconsole::write callback can be invokedon a CPU which is marked OFFLINE. That is misleading asit suggests that there is no contextual limit forinvoking the callback. The original motivation wasreadiness of the per-CPU areas.

CON_BRL

Indicates a braille device which is exempt fromreceiving the printk spam for obvious reasons.

CON_EXTENDED

The console supports the extended output format of/dev/kmesg which requires a larger output buffer.

CON_SUSPENDED

Indicates if a console is suspended. If true, theprinting callbacks must not be called.

CON_NBCON

Console can operate outside of the legacy style console_lockconstraints.

CON_NBCON_ATOMIC_UNSAFE

Thewrite_atomic() callback is not safe and istherefore only used bynbcon_atomic_flush_unsafe().

structconsole

The console descriptor structure

Definition:

struct console {    char name[16];    void (*write)(struct console *co, const char *s, unsigned int count);    int (*read)(struct console *co, char *s, unsigned int count);    struct tty_driver       *(*device)(struct console *co, int *index);    void (*unblank)(void);    int (*setup)(struct console *co, char *options);    int (*exit)(struct console *co);    int (*match)(struct console *co, char *name, int idx, char *options);    short flags;    short index;    int cflag;    uint ispeed;    uint ospeed;    u64 seq;    unsigned long           dropped;    void *data;    struct hlist_node       node;    void (*write_atomic)(struct console *con, struct nbcon_write_context *wctxt);    void (*write_thread)(struct console *con, struct nbcon_write_context *wctxt);    void (*device_lock)(struct console *con, unsigned long *flags);    void (*device_unlock)(struct console *con, unsigned long flags);    atomic_t nbcon_state;    atomic_long_t nbcon_seq;    struct nbcon_context  nbcon_device_ctxt;    atomic_long_t nbcon_prev_seq;    struct printk_buffers   *pbufs;    struct task_struct      *kthread;    struct rcuwait          rcuwait;    struct irq_work         irq_work;};

Members

name

The name of the console driver

write

Legacy write callback to output messages (Optional)

read

Read callback for console input (Optional)

device

The underlying TTY device driver (Optional)

unblank

Callback to unblank the console (Optional)

setup

Callback for initializing the console (Optional)

exit

Callback for teardown of the console (Optional)

match

Callback for matching a console (Optional)

flags

Console flags. Seeenumcons_flags

index

Console index, e.g. port number

cflag

TTY control mode flags

ispeed

TTY input speed

ospeed

TTY output speed

seq

Sequence number of the next ringbuffer record to print

dropped

Number of unreported dropped ringbuffer records

data

Driver private data

node

hlist node for the console list

write_atomic

NBCON callback to write out text in any context. (Optional)

This callback is called with the console already acquired. However,a higher priority context is allowed to take it over by default.

The callback must callnbcon_enter_unsafe() andnbcon_exit_unsafe()around any code where the takeover is not safe, for example, whenmanipulating the serial port registers.

nbcon_enter_unsafe() will fail if the context has lost the consoleownership in the meantime. In this case, the callback is no longerallowed to go forward. It must back out immediately and carefully.The buffer content is also no longer trusted since it no longerbelongs to the context.

The callback should allow the takeover whenever it is safe. Itincreases the chance to see messages when the system is in trouble.If the driver must reacquire ownership in order to finalize orrevert hardware changes,nbcon_reacquire_nobuf() can be used.However, on reacquire the buffer content is no longer available. Areacquire cannot be used to resume printing.

The callback can be called from any context (including NMI).Therefore it must avoid usage of any locking and instead relyon the console ownership for synchronization.

write_thread

NBCON callback to write out text in task context.

This callback must be called only in task context with bothdevice_lock() and the nbcon console acquired withNBCON_PRIO_NORMAL.

The same rules for console ownership verification and unsafesections handling applies as withwrite_atomic().

The console ownership handling is necessary for synchronizationagainstwrite_atomic() which is synchronized only via the context.

Thedevice_lock() provides the primary serialization for operationson the device. It might be as relaxed (mutex)[*] or as tight(disabled preemption and interrupts) as needed. It allowsthe kthread to operate in the least restrictive mode[**].

[*] Standalone nbcon_context_try_acquire() is not safe with

the preemption enabled, seenbcon_owner_matches(). But itcan be safe when always called in the preemptive contextunder thedevice_lock().

[**] The device_lock() makes sure that nbcon_context_try_acquire()

would never need to spin which is important especially withPREEMPT_RT.

device_lock

NBCON callback to begin synchronization with driver code.

Console drivers typically must deal with access to the hardwarevia user input/output (such as an interactive login shell) andoutput of kernel messages viaprintk() calls. This callback iscalled by the printk-subsystem whenever it needs to synchronizewith hardware access by the driver. It should be implemented touse whatever synchronization mechanism the driver is using foritself (for example, the port lock for uart serial consoles).

The callback is always called from task context. It may use anysynchronization method required by the driver.

IMPORTANT: The callback MUST disable migration. The console driver

may be using a synchronization mechanism that already takescare of this (such as spinlocks). Otherwise this function mustexplicitly callmigrate_disable().

The flags argument is provided as a convenience to the driver. Itwill be passed again todevice_unlock(). It can be ignored if thedriver does not need it.

device_unlock

NBCON callback to finish synchronization with driver code.

It is the counterpart todevice_lock().

This callback is always called from task context. It mustappropriately re-enable migration (depending on howdevice_lock()disabled migration).

The flags argument is the value of the same variable that waspassed todevice_lock().

nbcon_state

State for nbcon consoles

nbcon_seq

Sequence number of the next record for nbcon to print

nbcon_device_ctxt

Context available for non-printing operations

nbcon_prev_seq

Seq num the previous nbcon owner was assigned to print

pbufs

Pointer to nbcon private buffer

kthread

Printer kthread for this console

rcuwait

RCU-safe wait object forkthread waking

irq_work

Deferkthread waking to IRQ work context

Internals

structnbcon_state

console state for nbcon consoles

Definition:

struct nbcon_state {    union {        unsigned int    atom;        struct {            unsigned int prio               :  2;            unsigned int req_prio           :  2;            unsigned int unsafe             :  1;            unsigned int unsafe_takeover    :  1;            unsigned int cpu                : 24;        };    };};

Members

{unnamed_union}

anonymous

atom

Compound of the state fields for atomic operations

{unnamed_struct}

anonymous

prio

The priority of the current owner

req_prio

The priority of a handover request

unsafe

Console is busy in a non takeover region

unsafe_takeover

A hostile takeover in an unsafe state happened in thepast. The console cannot be safe until re-initialized.

cpu

The CPU on which the owner runs

Description

To be used for reading and preparing of the value stored in the nbconstate variableconsole::nbcon_state.

Theprio andreq_prio fields are particularly important to allowspin-waiting to timeout and give up without the risk of a waiter beingassigned the lock after giving up.

enumnbcon_prio

console owner priority for nbcon consoles

Constants

NBCON_PRIO_NONE

Unused

NBCON_PRIO_NORMAL

Normal (non-emergency) usage

NBCON_PRIO_EMERGENCY

Emergency output (WARN/OOPS...)

NBCON_PRIO_PANIC

Panic output

NBCON_PRIO_MAX

The number of priority levels

Description

A higher priority context can takeover the console when it isin the safe state. The final attempt to flush consoles inpanic()can be allowed to do so even in an unsafe state (Hope and pray).

structnbcon_context

Context for console acquire/release

Definition:

struct nbcon_context {    struct console          *console;    unsigned int            spinwait_max_us;    enum nbcon_prio         prio;    unsigned int            allow_unsafe_takeover   : 1;    unsigned int            backlog                 : 1;    struct printk_buffers   *pbufs;    u64 seq;};

Members

console

The associated console

spinwait_max_us

Limit for spin-wait acquire

prio

Priority of the context

allow_unsafe_takeover

Allow performing takeover even if unsafe. Canbe used only with NBCON_PRIO_PANICprio. Itmight cause a system freeze when the consoleis used later.

backlog

Ringbuffer has pending records

pbufs

Pointer to the text buffer for this context

seq

The sequence number to print for this context

structnbcon_write_context

Context handed to the nbcon write callbacks

Definition:

struct nbcon_write_context {    struct nbcon_context  ctxt;    char *outbuf;    unsigned int            len;    bool unsafe_takeover;};

Members

ctxt

The core console context

outbuf

Pointer to the text buffer for output

len

Length to write

unsafe_takeover

If a hostile takeover in an unsafe state has occurred

Struct Consw

structconsw

callbacks for consoles

Definition:

struct consw {    struct module *owner;    const char *(*con_startup)(void);    void (*con_init)(struct vc_data *vc, bool init);    void (*con_deinit)(struct vc_data *vc);    void (*con_clear)(struct vc_data *vc, unsigned int y, unsigned int x, unsigned int count);    void (*con_putc)(struct vc_data *vc, u16 ca, unsigned int y, unsigned int x);    void (*con_putcs)(struct vc_data *vc, const u16 *s, unsigned int count, unsigned int ypos, unsigned int xpos);    void (*con_cursor)(struct vc_data *vc, bool enable);    bool (*con_scroll)(struct vc_data *vc, unsigned int top, unsigned int bottom, enum con_scroll dir, unsigned int lines);    bool (*con_switch)(struct vc_data *vc);    bool (*con_blank)(struct vc_data *vc, enum vesa_blank_mode blank, bool mode_switch);    int (*con_font_set)(struct vc_data *vc, const struct console_font *font, unsigned int vpitch, unsigned int flags);    int (*con_font_get)(struct vc_data *vc, struct console_font *font, unsigned int vpitch);    int (*con_font_default)(struct vc_data *vc, struct console_font *font, const char *name);    int (*con_resize)(struct vc_data *vc, unsigned int width, unsigned int height, bool from_user);    void (*con_set_palette)(struct vc_data *vc, const unsigned char *table);    void (*con_scrolldelta)(struct vc_data *vc, int lines);    bool (*con_set_origin)(struct vc_data *vc);    void (*con_save_screen)(struct vc_data *vc);    u8 (*con_build_attr)(struct vc_data *vc, u8 color, enum vc_intensity intensity, bool blink, bool underline, bool reverse, bool italic);    void (*con_invert_region)(struct vc_data *vc, u16 *p, int count);};

Members

owner

the module to get references of when this console is used

con_startup

set up the console and return its name (like VGA, EGA, ...)

con_init

initialize the console onvc.init is true for the very firstcall on thisvc.

con_deinit

deinitialize the console fromvc.

con_clear

erasecount characters at [x,y] onvc.count >= 1.

con_putc

emit one character with attributesca to [x,y] onvc.(optional --con_putcs would be called instead)

con_putcs

emitcount characters with attributess to [x,y] onvc.

con_cursor

enable/disable cursor depending onenable

con_scroll

move lines fromtop tobottom in directiondir bylines.Return true if no generic handling should be done.Invoked by csi_M and printing to the console.

con_switch

notifier about the console switch; it is supposed to returntrue if a redraw is needed.

con_blank

blank/unblank the console. The target mode is passed inblank.mode_switch is set if changing from/to text/graphics. The hookis supposed to return true if a redraw is needed.

con_font_set

set consolevc font tofont with heightvpitch.flags canbeKD_FONT_FLAG_DONT_RECALC. (optional)

con_font_get

fetch the current font onvc of heightvpitch intofont.(optional)

con_font_default

set default font onvc.name can beNULL or font nameto search for.font can be filled back. (optional)

con_resize

resize thevc console towidth xheight.from_user is truewhen this change comes from the user space.

con_set_palette

sets the palette of the consolevc totable (optional)

con_scrolldelta

the contents of the console should be scrolled bylines.Invoked by user. (optional)

con_set_origin

set origin (seevc_data::vc_origin) of thevc. If notprovided or returns false, the origin is set tovc->vc_screenbuf. (optional)

con_save_screen

save screen content intovc->vc_screenbuf. Called e.g.upon entering graphics. (optional)

con_build_attr

build attributes based oncolor,intensity and otherparameters. The result is used for both normal and erasecharacters. (optional)

con_invert_region

invert a region of lengthcount onvc starting atp.(optional)

Console functions

shortconsole_srcu_read_flags(conststructconsole*con)

Locklessly read flags of a possibly registered console

Parameters

conststructconsole*con

structconsole pointer of console to read flags from

Description

Locklessly readingcon->flags provides a consistent read value becausethere is at most one CPU modifyingcon->flags and that CPU is using onlyread-modify-write operations to do so.

Requires console_srcu_read_lock to be held, which implies thatcon mightbe a registered console. The purpose of holding console_srcu_read_lock isto guarantee that the console state is valid (CON_SUSPENDED/CON_ENABLED)and that no exit/cleanup routines will run if the console is currentlyundergoing unregistration.

If the caller is holding the console_list_lock or it is _certain_ thatcon is not and will not become registered, the caller may readcon->flags directly instead.

Context

Any context.

Return

The current value of thecon->flags field.

voidconsole_srcu_write_flags(structconsole*con,shortflags)

Write flags for a registered console

Parameters

structconsole*con

structconsole pointer of console to write flags to

shortflags

new flags value to write

Description

Only use this function to write flags for registered consoles. Itrequires holding the console_list_lock.

Context

Any context.

for_each_console_srcu

for_each_console_srcu(con)

Iterator over registered consoles

Parameters

con

structconsole pointer used as loop cursor

Description

Although SRCU guarantees the console list will be consistent, thestructconsole fields may be updated by other CPUs while iterating.

Requires console_srcu_read_lock to be held. Can be invoked fromany context.

for_each_console

for_each_console(con)

Iterator over registered consoles

Parameters

con

structconsole pointer used as loop cursor

Description

The console list and theconsole.flags are immutable while iterating.

Requires console_list_lock to be held.

voidclear_selection(void)

remove current selection

Parameters

void

no arguments

Description

Remove the current selection highlight, if any from the console holding theselection.

Locking: The caller must hold the console lock.

int__vc_resize(structvc_data*vc,unsignedintcols,unsignedintrows,boolfrom_user)

resize a VT

Parameters

structvc_data*vc

virtual console

unsignedintcols

columns

unsignedintrows

rows

boolfrom_user

invoked by a user?

Description

Resize a virtual console as seen from the console end of things. We use thecommonvc_do_resize() method to update the structures.

Locking: The caller must hold the console sem to protect console internalsandvc->port.tty.

intcon_is_bound(conststructconsw*csw)

checks if driver is bound to the console

Parameters

conststructconsw*csw

console driver

Return

zero if unbound, nonzero if bound

Description

Drivers can call this and if zero, they should releaseall resources allocated onconsw.con_startup()

boolcon_is_visible(conststructvc_data*vc)

checks whether the current console is visible

Parameters

conststructvc_data*vc

virtual console

Return

zero if not visible, nonzero if visible

voidcon_debug_enter(structvc_data*vc)

prepare the console for the kernel debugger

Parameters

structvc_data*vc

virtual console

Description

Called when the console is taken over by the kernel debugger, thisfunction needs to save the current console state, then put the consoleinto a state suitable for the kernel debugger.

voidcon_debug_leave(void)

restore console state

Parameters

void

no arguments

Description

Restore the console state to what it was before the kernel debuggerwas invoked.

intdo_unregister_con_driver(conststructconsw*csw)

unregister console driver from console layer

Parameters

conststructconsw*csw

console driver

Description

All drivers that registers to the console layer mustcall this function upon exit, or if the console driver is in a statewhere it won’t be able to handle console services, such as theframebuffer console without loaded framebuffer drivers.

The driver must unbind first prior to unregistration.

Internals

intsel_loadlut(u32__user*lut)

load the LUT table

Parameters

u32__user*lut

user table

Description

Load the LUT table from user space. Make a temporary copy so a partialupdate doesn’t make a mess.

Locking: The console lock is acquired.

intset_selection_user(conststructtiocl_selection__user*sel,structtty_struct*tty)

set the current selection.

Parameters

conststructtiocl_selection__user*sel

user selection info

structtty_struct*tty

the console tty

Description

Invoked by the ioctl handle for the vt layer.

Locking: The entire selection process is managed under the console_lock.It’s a lot under the lock but its hardly a performance path.

intvc_do_resize(structtty_struct*tty,structvc_data*vc,unsignedintcols,unsignedintlines,boolfrom_user)

resizing method for the tty

Parameters

structtty_struct*tty

tty being resized

structvc_data*vc

virtual console private data

unsignedintcols

columns

unsignedintlines

lines

boolfrom_user

invoked by a user?

Description

Resize a virtual console, clipping according to the actual constraints. Ifthe caller passes a tty structure then update the termios winsizeinformation and perform any necessary signal handling.

Locking: Caller must hold the console semaphore. Takes the termios rwsem andctrl.lock of the tty IFF a tty is passed.

intvt_resize(structtty_struct*tty,structwinsize*ws)

resize a VT

Parameters

structtty_struct*tty

tty to resize

structwinsize*ws

winsize attributes

Description

Resize a virtual terminal. This is called by the tty layer as we registerour own handler for resizing. The mutual helper does all the actual work.

Locking: Takes the console sem and the called methods then take the ttytermios_rwsem and the tty ctrl.lock in that order.

enumvc_ctl_state

control characters state of a vt

Constants

ESnormal

initial state, no control characters parsed

ESesc

ESC parsed

ESsquare

CSI parsed -- modifiers/parameters/ctrl chars expected

ESgetpars

CSI parsed -- parameters/ctrl chars expected

ESfunckey

CSI [ parsed

EShash

ESC # parsed

ESsetG0

ESC ( parsed

ESsetG1

ESC ) parsed

ESpercent

ESC % parsed

EScsiignore

CSI [0x20-0x3f] parsed

ESnonstd

OSC parsed

ESpalette

OSC P parsed

ESosc

OSC [0-9] parsed

ESANSI_first

first state for ignoring ansi control sequences

ESapc

ESC _ parsed

ESpm

ESC ^ parsed

ESdcs

ESC P parsed

ESANSI_last

last state for ignoring ansi control sequences

intvc_sanitize_unicode(constintc)

Replace invalid Unicode code points withU+FFFD

Parameters

constintc

the received code point

intvc_translate_unicode(structvc_data*vc,intc,bool*rescan)

Combine UTF-8 into Unicode invc_data.vc_utf_char

Parameters

structvc_data*vc

virtual console

intc

UTF-8 byte to translate

bool*rescan

set to true iffc wasn’t consumed here and needs to be re-processed

Description

  • vc_data.vc_utf_char is the being-constructed Unicode code point.

  • vc_data.vc_utf_count is the number of continuation bytes still expected toarrive.

  • vc_data.vc_npar is the number of continuation bytes arrived so far.

Return

  • -1 - Input OK so far,c consumed, further bytes expected.

  • 0xFFFD - Possibility 1: input invalid,c may have been consumed (see

    desc. ofrescan). Possibility 2: input OK,c consumed,U+FFFD is the resulting code point.U+FFFD is valid,REPLACEMENTCHARACTER.

  • otherwise - Input OK,c consumed, resulting code point returned.

intvt_kmsg_redirect(intnew)

sets/gets the kernel message console

Parameters

intnew

the new virtual terminal number or -1 if the console should stayunchanged

Description

By default, the kernel messages are always printed on the current virtualconsole. However, the user may modify that default with theTIOCL_SETKMSGREDIRECT ioctl call.

This function sets the kernel message console to benew. It returns the oldvirtual console number. The virtual terminal number0 (both as parameter andreturn value) means no redirection (i.e. always printed on the currentlyactive console).

The parameter -1 means that only the current console is returned, but thevalue is not modified. You may use the macrovt_get_kmsg_redirect() in thatcase to make the code more understandable.

When the kernel is compiled withoutCONFIG_VT_CONSOLE, this function ignoresthe parameter and always returns0.