LCOV - code coverage report
Current view: top level - include/linux - console.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 4 4 100.0 %
Date: 2023-03-27 20:00:47 Functions: 0 0 -

          Line data    Source code
       1             : /*
       2             :  *  linux/include/linux/console.h
       3             :  *
       4             :  *  Copyright (C) 1993        Hamish Macdonald
       5             :  *
       6             :  * This file is subject to the terms and conditions of the GNU General Public
       7             :  * License.  See the file COPYING in the main directory of this archive
       8             :  * for more details.
       9             :  *
      10             :  * Changed:
      11             :  * 10-Mar-94: Arno Griffioen: Conversion for vt100 emulator port from PC LINUX
      12             :  */
      13             : 
      14             : #ifndef _LINUX_CONSOLE_H_
      15             : #define _LINUX_CONSOLE_H_ 1
      16             : 
      17             : #include <linux/atomic.h>
      18             : #include <linux/bits.h>
      19             : #include <linux/rculist.h>
      20             : #include <linux/types.h>
      21             : 
      22             : struct vc_data;
      23             : struct console_font_op;
      24             : struct console_font;
      25             : struct module;
      26             : struct tty_struct;
      27             : struct notifier_block;
      28             : 
      29             : enum con_scroll {
      30             :         SM_UP,
      31             :         SM_DOWN,
      32             : };
      33             : 
      34             : enum vc_intensity;
      35             : 
      36             : /**
      37             :  * struct consw - callbacks for consoles
      38             :  *
      39             :  * @con_scroll: move lines from @top to @bottom in direction @dir by @lines.
      40             :  *              Return true if no generic handling should be done.
      41             :  *              Invoked by csi_M and printing to the console.
      42             :  * @con_set_palette: sets the palette of the console to @table (optional)
      43             :  * @con_scrolldelta: the contents of the console should be scrolled by @lines.
      44             :  *                   Invoked by user. (optional)
      45             :  */
      46             : struct consw {
      47             :         struct module *owner;
      48             :         const char *(*con_startup)(void);
      49             :         void    (*con_init)(struct vc_data *vc, int init);
      50             :         void    (*con_deinit)(struct vc_data *vc);
      51             :         void    (*con_clear)(struct vc_data *vc, int sy, int sx, int height,
      52             :                         int width);
      53             :         void    (*con_putc)(struct vc_data *vc, int c, int ypos, int xpos);
      54             :         void    (*con_putcs)(struct vc_data *vc, const unsigned short *s,
      55             :                         int count, int ypos, int xpos);
      56             :         void    (*con_cursor)(struct vc_data *vc, int mode);
      57             :         bool    (*con_scroll)(struct vc_data *vc, unsigned int top,
      58             :                         unsigned int bottom, enum con_scroll dir,
      59             :                         unsigned int lines);
      60             :         int     (*con_switch)(struct vc_data *vc);
      61             :         int     (*con_blank)(struct vc_data *vc, int blank, int mode_switch);
      62             :         int     (*con_font_set)(struct vc_data *vc, struct console_font *font,
      63             :                         unsigned int vpitch, unsigned int flags);
      64             :         int     (*con_font_get)(struct vc_data *vc, struct console_font *font,
      65             :                         unsigned int vpitch);
      66             :         int     (*con_font_default)(struct vc_data *vc,
      67             :                         struct console_font *font, char *name);
      68             :         int     (*con_resize)(struct vc_data *vc, unsigned int width,
      69             :                         unsigned int height, unsigned int user);
      70             :         void    (*con_set_palette)(struct vc_data *vc,
      71             :                         const unsigned char *table);
      72             :         void    (*con_scrolldelta)(struct vc_data *vc, int lines);
      73             :         int     (*con_set_origin)(struct vc_data *vc);
      74             :         void    (*con_save_screen)(struct vc_data *vc);
      75             :         u8      (*con_build_attr)(struct vc_data *vc, u8 color,
      76             :                         enum vc_intensity intensity,
      77             :                         bool blink, bool underline, bool reverse, bool italic);
      78             :         void    (*con_invert_region)(struct vc_data *vc, u16 *p, int count);
      79             :         u16    *(*con_screen_pos)(const struct vc_data *vc, int offset);
      80             :         unsigned long (*con_getxy)(struct vc_data *vc, unsigned long position,
      81             :                         int *px, int *py);
      82             :         /*
      83             :          * Flush the video console driver's scrollback buffer
      84             :          */
      85             :         void    (*con_flush_scrollback)(struct vc_data *vc);
      86             :         /*
      87             :          * Prepare the console for the debugger.  This includes, but is not
      88             :          * limited to, unblanking the console, loading an appropriate
      89             :          * palette, and allowing debugger generated output.
      90             :          */
      91             :         int     (*con_debug_enter)(struct vc_data *vc);
      92             :         /*
      93             :          * Restore the console to its pre-debug state as closely as possible.
      94             :          */
      95             :         int     (*con_debug_leave)(struct vc_data *vc);
      96             : };
      97             : 
      98             : extern const struct consw *conswitchp;
      99             : 
     100             : extern const struct consw dummy_con;    /* dummy console buffer */
     101             : extern const struct consw vga_con;      /* VGA text console */
     102             : extern const struct consw newport_con;  /* SGI Newport console  */
     103             : 
     104             : int con_is_bound(const struct consw *csw);
     105             : int do_unregister_con_driver(const struct consw *csw);
     106             : int do_take_over_console(const struct consw *sw, int first, int last, int deflt);
     107             : void give_up_console(const struct consw *sw);
     108             : #ifdef CONFIG_HW_CONSOLE
     109             : int con_debug_enter(struct vc_data *vc);
     110             : int con_debug_leave(void);
     111             : #else
     112             : static inline int con_debug_enter(struct vc_data *vc)
     113             : {
     114             :         return 0;
     115             : }
     116             : static inline int con_debug_leave(void)
     117             : {
     118             :         return 0;
     119             : }
     120             : #endif
     121             : 
     122             : /* cursor */
     123             : #define CM_DRAW     (1)
     124             : #define CM_ERASE    (2)
     125             : #define CM_MOVE     (3)
     126             : 
     127             : /*
     128             :  * The interface for a console, or any other device that wants to capture
     129             :  * console messages (printer driver?)
     130             :  */
     131             : 
     132             : /**
     133             :  * cons_flags - General console flags
     134             :  * @CON_PRINTBUFFER:    Used by newly registered consoles to avoid duplicate
     135             :  *                      output of messages that were already shown by boot
     136             :  *                      consoles or read by userspace via syslog() syscall.
     137             :  * @CON_CONSDEV:        Indicates that the console driver is backing
     138             :  *                      /dev/console.
     139             :  * @CON_ENABLED:        Indicates if a console is allowed to print records. If
     140             :  *                      false, the console also will not advance to later
     141             :  *                      records.
     142             :  * @CON_BOOT:           Marks the console driver as early console driver which
     143             :  *                      is used during boot before the real driver becomes
     144             :  *                      available. It will be automatically unregistered
     145             :  *                      when the real console driver is registered unless
     146             :  *                      "keep_bootcon" parameter is used.
     147             :  * @CON_ANYTIME:        A misnomed historical flag which tells the core code
     148             :  *                      that the legacy @console::write callback can be invoked
     149             :  *                      on a CPU which is marked OFFLINE. That is misleading as
     150             :  *                      it suggests that there is no contextual limit for
     151             :  *                      invoking the callback. The original motivation was
     152             :  *                      readiness of the per-CPU areas.
     153             :  * @CON_BRL:            Indicates a braille device which is exempt from
     154             :  *                      receiving the printk spam for obvious reasons.
     155             :  * @CON_EXTENDED:       The console supports the extended output format of
     156             :  *                      /dev/kmesg which requires a larger output buffer.
     157             :  */
     158             : enum cons_flags {
     159             :         CON_PRINTBUFFER         = BIT(0),
     160             :         CON_CONSDEV             = BIT(1),
     161             :         CON_ENABLED             = BIT(2),
     162             :         CON_BOOT                = BIT(3),
     163             :         CON_ANYTIME             = BIT(4),
     164             :         CON_BRL                 = BIT(5),
     165             :         CON_EXTENDED            = BIT(6),
     166             : };
     167             : 
     168             : /**
     169             :  * struct console - The console descriptor structure
     170             :  * @name:               The name of the console driver
     171             :  * @write:              Write callback to output messages (Optional)
     172             :  * @read:               Read callback for console input (Optional)
     173             :  * @device:             The underlying TTY device driver (Optional)
     174             :  * @unblank:            Callback to unblank the console (Optional)
     175             :  * @setup:              Callback for initializing the console (Optional)
     176             :  * @exit:               Callback for teardown of the console (Optional)
     177             :  * @match:              Callback for matching a console (Optional)
     178             :  * @flags:              Console flags. See enum cons_flags
     179             :  * @index:              Console index, e.g. port number
     180             :  * @cflag:              TTY control mode flags
     181             :  * @ispeed:             TTY input speed
     182             :  * @ospeed:             TTY output speed
     183             :  * @seq:                Sequence number of the next ringbuffer record to print
     184             :  * @dropped:            Number of unreported dropped ringbuffer records
     185             :  * @data:               Driver private data
     186             :  * @node:               hlist node for the console list
     187             :  */
     188             : struct console {
     189             :         char                    name[16];
     190             :         void                    (*write)(struct console *co, const char *s, unsigned int count);
     191             :         int                     (*read)(struct console *co, char *s, unsigned int count);
     192             :         struct tty_driver       *(*device)(struct console *co, int *index);
     193             :         void                    (*unblank)(void);
     194             :         int                     (*setup)(struct console *co, char *options);
     195             :         int                     (*exit)(struct console *co);
     196             :         int                     (*match)(struct console *co, char *name, int idx, char *options);
     197             :         short                   flags;
     198             :         short                   index;
     199             :         int                     cflag;
     200             :         uint                    ispeed;
     201             :         uint                    ospeed;
     202             :         u64                     seq;
     203             :         unsigned long           dropped;
     204             :         void                    *data;
     205             :         struct hlist_node       node;
     206             : };
     207             : 
     208             : #ifdef CONFIG_LOCKDEP
     209             : extern void lockdep_assert_console_list_lock_held(void);
     210             : #else
     211             : static inline void lockdep_assert_console_list_lock_held(void)
     212             : {
     213             : }
     214             : #endif
     215             : 
     216             : #ifdef CONFIG_DEBUG_LOCK_ALLOC
     217             : extern bool console_srcu_read_lock_is_held(void);
     218             : #else
     219             : static inline bool console_srcu_read_lock_is_held(void)
     220             : {
     221             :         return 1;
     222             : }
     223             : #endif
     224             : 
     225             : extern int console_srcu_read_lock(void);
     226             : extern void console_srcu_read_unlock(int cookie);
     227             : 
     228             : extern void console_list_lock(void) __acquires(console_mutex);
     229             : extern void console_list_unlock(void) __releases(console_mutex);
     230             : 
     231             : extern struct hlist_head console_list;
     232             : 
     233             : /**
     234             :  * console_srcu_read_flags - Locklessly read the console flags
     235             :  * @con:        struct console pointer of console to read flags from
     236             :  *
     237             :  * This function provides the necessary READ_ONCE() and data_race()
     238             :  * notation for locklessly reading the console flags. The READ_ONCE()
     239             :  * in this function matches the WRITE_ONCE() when @flags are modified
     240             :  * for registered consoles with console_srcu_write_flags().
     241             :  *
     242             :  * Only use this function to read console flags when locklessly
     243             :  * iterating the console list via srcu.
     244             :  *
     245             :  * Context: Any context.
     246             :  */
     247             : static inline short console_srcu_read_flags(const struct console *con)
     248             : {
     249        5514 :         WARN_ON_ONCE(!console_srcu_read_lock_is_held());
     250             : 
     251             :         /*
     252             :          * Locklessly reading console->flags provides a consistent
     253             :          * read value because there is at most one CPU modifying
     254             :          * console->flags and that CPU is using only read-modify-write
     255             :          * operations to do so.
     256             :          */
     257        5514 :         return data_race(READ_ONCE(con->flags));
     258             : }
     259             : 
     260             : /**
     261             :  * console_srcu_write_flags - Write flags for a registered console
     262             :  * @con:        struct console pointer of console to write flags to
     263             :  * @flags:      new flags value to write
     264             :  *
     265             :  * Only use this function to write flags for registered consoles. It
     266             :  * requires holding the console_list_lock.
     267             :  *
     268             :  * Context: Any context.
     269             :  */
     270             : static inline void console_srcu_write_flags(struct console *con, short flags)
     271             : {
     272             :         lockdep_assert_console_list_lock_held();
     273             : 
     274             :         /* This matches the READ_ONCE() in console_srcu_read_flags(). */
     275           1 :         WRITE_ONCE(con->flags, flags);
     276             : }
     277             : 
     278             : /* Variant of console_is_registered() when the console_list_lock is held. */
     279             : static inline bool console_is_registered_locked(const struct console *con)
     280             : {
     281             :         lockdep_assert_console_list_lock_held();
     282           1 :         return !hlist_unhashed(&con->node);
     283             : }
     284             : 
     285             : /*
     286             :  * console_is_registered - Check if the console is registered
     287             :  * @con:        struct console pointer of console to check
     288             :  *
     289             :  * Context: Process context. May sleep while acquiring console list lock.
     290             :  * Return: true if the console is in the console list, otherwise false.
     291             :  *
     292             :  * If false is returned for a console that was previously registered, it
     293             :  * can be assumed that the console's unregistration is fully completed,
     294             :  * including the exit() callback after console list removal.
     295             :  */
     296             : static inline bool console_is_registered(const struct console *con)
     297             : {
     298             :         bool ret;
     299             : 
     300             :         console_list_lock();
     301             :         ret = console_is_registered_locked(con);
     302             :         console_list_unlock();
     303             :         return ret;
     304             : }
     305             : 
     306             : /**
     307             :  * for_each_console_srcu() - Iterator over registered consoles
     308             :  * @con:        struct console pointer used as loop cursor
     309             :  *
     310             :  * Although SRCU guarantees the console list will be consistent, the
     311             :  * struct console fields may be updated by other CPUs while iterating.
     312             :  *
     313             :  * Requires console_srcu_read_lock to be held. Can be invoked from
     314             :  * any context.
     315             :  */
     316             : #define for_each_console_srcu(con)                                      \
     317             :         hlist_for_each_entry_srcu(con, &console_list, node,         \
     318             :                                   console_srcu_read_lock_is_held())
     319             : 
     320             : /**
     321             :  * for_each_console() - Iterator over registered consoles
     322             :  * @con:        struct console pointer used as loop cursor
     323             :  *
     324             :  * The console list and the console->flags are immutable while iterating.
     325             :  *
     326             :  * Requires console_list_lock to be held.
     327             :  */
     328             : #define for_each_console(con)                                           \
     329             :         lockdep_assert_console_list_lock_held();                        \
     330             :         hlist_for_each_entry(con, &console_list, node)
     331             : 
     332             : extern int console_set_on_cmdline;
     333             : extern struct console *early_console;
     334             : 
     335             : enum con_flush_mode {
     336             :         CONSOLE_FLUSH_PENDING,
     337             :         CONSOLE_REPLAY_ALL,
     338             : };
     339             : 
     340             : extern int add_preferred_console(char *name, int idx, char *options);
     341             : extern void console_force_preferred_locked(struct console *con);
     342             : extern void register_console(struct console *);
     343             : extern int unregister_console(struct console *);
     344             : extern void console_lock(void);
     345             : extern int console_trylock(void);
     346             : extern void console_unlock(void);
     347             : extern void console_conditional_schedule(void);
     348             : extern void console_unblank(void);
     349             : extern void console_flush_on_panic(enum con_flush_mode mode);
     350             : extern struct tty_driver *console_device(int *);
     351             : extern void console_stop(struct console *);
     352             : extern void console_start(struct console *);
     353             : extern int is_console_locked(void);
     354             : extern int braille_register_console(struct console *, int index,
     355             :                 char *console_options, char *braille_options);
     356             : extern int braille_unregister_console(struct console *);
     357             : #ifdef CONFIG_TTY
     358             : extern void console_sysfs_notify(void);
     359             : #else
     360             : static inline void console_sysfs_notify(void)
     361             : { }
     362             : #endif
     363             : extern bool console_suspend_enabled;
     364             : 
     365             : /* Suspend and resume console messages over PM events */
     366             : extern void suspend_console(void);
     367             : extern void resume_console(void);
     368             : 
     369             : int mda_console_init(void);
     370             : 
     371             : void vcs_make_sysfs(int index);
     372             : void vcs_remove_sysfs(int index);
     373             : 
     374             : /* Some debug stub to catch some of the obvious races in the VT code */
     375             : #define WARN_CONSOLE_UNLOCKED()                                         \
     376             :         WARN_ON(!atomic_read(&ignore_console_lock_warning) &&               \
     377             :                 !is_console_locked() && !oops_in_progress)
     378             : /*
     379             :  * Increment ignore_console_lock_warning if you need to quiet
     380             :  * WARN_CONSOLE_UNLOCKED() for debugging purposes.
     381             :  */
     382             : extern atomic_t ignore_console_lock_warning;
     383             : 
     384             : /* VESA Blanking Levels */
     385             : #define VESA_NO_BLANKING        0
     386             : #define VESA_VSYNC_SUSPEND      1
     387             : #define VESA_HSYNC_SUSPEND      2
     388             : #define VESA_POWERDOWN          3
     389             : 
     390             : extern void console_init(void);
     391             : 
     392             : /* For deferred console takeover */
     393             : void dummycon_register_output_notifier(struct notifier_block *nb);
     394             : void dummycon_unregister_output_notifier(struct notifier_block *nb);
     395             : 
     396             : #endif /* _LINUX_CONSOLE_H */

Generated by: LCOV version 1.14